Hello,
I have two arrays of different sizes and I Would like to find certain range between them, where the start index is from one array and ends with another array. For example:
A = [4192 23330 23342 29974 49089 49093 49096 55753 57035 57039]
B = [22780 48556 56522]
The desired output would be
C = [4192 22780; 29974 48556 ; 49096 56522]
Note that A and B can change in size, but array B is always the end point value.
Thanks, Max

1 Kommentar

Stephen23
Stephen23 am 20 Jul. 2016
Bearbeitet: Stephen23 am 20 Jul. 2016
Should the example really be this? :
C = [4192 22780; 29974 48556 ; 55753 56522]
Or if not, please explain why 49096 is selected, and not 55753.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Stephen23
Stephen23 am 20 Jul. 2016
Bearbeitet: Stephen23 am 20 Jul. 2016

0 Stimmen

Assuming that the rule really should pick the closest values from A that a re less than the values in B:
>> A = [4192 23330 23342 29974 49089 49093 49096 55753 57035 57039];
>> B = [22780 48556 56522];
>>
>> X = A(any(diff(bsxfun(@lt,A(:),B(:).')),2));
>> C = [X(:),B(:)]
C =
4192 22780
29974 48556
55753 56522

2 Kommentare

Sorry for the mistake, but yes it should be the closest values from A that are less than B.
I got an error using your code:
>> X = A(any(diff(bsxfun(@lt,A(:),B)),2));
Error using bsxfun
Non-singleton dimensions of the two input arrays must match each other.
Stephen23
Stephen23 am 20 Jul. 2016
@Max Bernstein: this error happens because the vector B you are using is a column vector, whereas the vector B you gave in your example is a row vector. I fixed my code to work with both of these.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Thorsten
Thorsten am 20 Jul. 2016

1 Stimme

If you use that highest value that is still smaller than the corresponding B, you can write:
C = [A(arrayfun(@(i) find(A < B(i), 1, 'last'), 1:numel(B))); B]'
But this differs from your desired output. So what is the rule according to which you pick the values form A?

1 Kommentar

Max Bernstein
Max Bernstein am 20 Jul. 2016
Sorry for the mistake, but yes it should be the closest values from A that are less than B.
Your answer works great, my desired output is:
C = [A(arrayfun(@(i) find(A < B(i), 1, 'last'), 1:numel(B))), B]'
replaced ; with ,

Melden Sie sich an, um zu kommentieren.

Produkte

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by