sub2ind, picking specific values from a 3d matrix
Show older comments
I have a 500x8x4 matrix, lets call this X, and I have a 500x1 vector, lets call it Y, the latter contains numbers between 1 and 8. These numbers indicate the number in each row that I want from the matrix X. So by picking a number in each row of matrix X, I need to get a matrix that is 500x4, lets call it Z. I dont know how to get this vector Z, in a quick way (not using a loop). I know I should do it with sub2ind but I dont know how. Thank you for your help.
Accepted Answer
More Answers (1)
Dan Nussinson
on 10 May 2019
0 votes
Sean is right when the matrices are small as in your example. For large for loops sub2ind is x10 faster on my system:
% Data
X = randn(50000,8,4); % z
Y = randi(8,50000,1); % idx
% Engine
szX = size(X);
tic
Z = zeros(szX([1 3]));
for ii = 1:szX(1)
Z(ii,:) = X(ii,Y(ii),:);
end
toc
%sub2ind
tic
ii = 1:szX(1);
linInds = sub2ind(szX([1 2]),ii',Y);
X2 = reshape(X,szX(1)*szX(2),[]);
Z2 = X2(linInds,:);
toc
Categories
Find more on Resizing and Reshaping Matrices 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!