Find range between two array's indexes

3 次查看(过去 30 天)
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 个评论
Stephen23
Stephen23 2016-7-20
编辑:Stephen23 2016-7-20
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.

请先登录,再进行评论。

采纳的回答

Stephen23
Stephen23 2016-7-20
编辑:Stephen23 2016-7-20
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 个评论
Max Bernstein
Max Bernstein 2016-7-20
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 2016-7-20
@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.

请先登录,再进行评论。

更多回答(1 个)

Thorsten
Thorsten 2016-7-20
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 个评论
Max Bernstein
Max Bernstein 2016-7-20
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 ,

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by