Extract lines of a three dimensional matrix using an array of indices and NO for-loop

I have a three dimensional 10x5x2 array. Example:
r(:,:,1) = [1 0 2 1 1; 2 0 3 1 1; 3 0 4 1 1; 4 0 1 1 -1; 5 0 -1 1 1; 1 1 3 1 -1; 2 1 2 1 1; 3 1 5 0 -1; 4 1 4 1 -1; 5 1 1 0 -1];
r(:,:,2) = [1 0 2 1 -1;2 0 3 1 1;3 0 1 1 -1;4 0 1 1 -1;5 0 -1 1 1;1 1 1 1 -1;2 1 2 1 1;3 1 4 1 1;4 1 5 1 1;5 1 3 0 1]
and logical vector m like for instance: m =
10×2 logical array
1 0
0 0
0 1
0 0
0 0
0 0
0 0
0 0
0 0
0 0
how can I access those lines of r, when m(:,k) is used as index vector of r(:,:,k). In this example the result should be line 1 of r(:,:,1) and line 3 of r(:,:,2) or
1 0 2 1 1
3 0 1 1 -1
important: for performance reasons I want to do it without a for-loop.
Thanks for anyone's help!

 Accepted Answer

Use column 1 of m to select rows of r in the first
>> r( m(:,1), :,1)
ans =
1 0 2 1 1
Use column 2 of m to select rows of r in the other
>> r( m(:,2), :,2)
ans =
3 0 1 1 -1

3 Comments

But what would I do if my matrix is r(10,5,100000) instead of r(10,5,2) ? The expression as you describe would become too big...
Or what oucld I do, if the size of the third dimension is unknown or changes?
Doing it with a foor loop would be simple, but is very slow...
oops. commented in wrong place.
You can use arrayfun and pass in numbers which you'll use as indexes
a = arrayfun(@(X) r( m(:,X), :, X ), 1:size(r,3), 'un', 0 );
The result comes out as an array of cells, but that's easy to make usable again
b = vertcat( a{:} )
b =
1 0 2 1 1
3 0 1 1 -1

Sign in to comment.

More Answers (0)

Asked:

on 4 Mar 2020

Commented:

on 5 Mar 2020

Community Treasure Hunt

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

Start Hunting!