Clear Filters
Clear Filters

Using matrix index coming from max function to get values from another matrix

1 view (last 30 days)
Dear All, I have the following problem:
A = randn(5,5);
B = randn(5,5);
C = randn(5,5);
D = cat(3,A,B,C);
E = randn(5,5,3);
[M,I] = max(D,[],3);
How to use the index matrix I to get respective elements from matrix E ? It means for every combination of i and j I want to take the value of E(i,j,:) whose index is given by the value of I(i,j).
I will be grateful for any comments!

Accepted Answer

Star Strider
Star Strider on 8 Nov 2017
This seems to work:
A = randn(5,5);
B = randn(5,5);
C = randn(5,5);
D = cat(3,A,B,C);
E = randn(5,5,3);
[M,I] = max(D,[],3);
IL = sub2ind(size(D), cumsum(ones(size(D,1)),1), cumsum(ones(size(D,2)),2), I);
Check = D(IL); % Check To Be Sure Indexing Is Correct
Result = E(IL);
The ‘Check’ assignment demonstrates that the indexing reproduces ‘M’. It is not necessary for the code, and can be deleted.
  4 Comments
Adam Pigon
Adam Pigon on 8 Nov 2017
I have a small additional question : what if my problem takes more dimensions, i.e. matrices A,B,C are like size(A) = (5,5,5) ? How should I proceed then? I cannot fully understand the function sub2ind.
Star Strider
Star Strider on 8 Nov 2017
My code should work for all sizes of 3D matrices, since it uses the size function to create the relevant index matrices. (My code could be extended using the same idea to 4D and higher-dimension matrices. I have not explored that possibility.)
MATLAB actually addresses matrices with ‘linear indexing’, a segment of adjacent memory locations, not subscripts. The sub2ind function converts subscript indices to linear indices, that in many instances are the only effective way to index into a matrix, as with your matrix here. (The related ind2sub function does the reverse.)

Sign in to comment.

More Answers (0)

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!