필터 지우기
필터 지우기

sub2ind, picking specific values from a 3d matrix

조회 수: 3 (최근 30일)
Kim
Kim 2014년 6월 9일
답변: Dan Nussinson 2019년 5월 10일
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.

채택된 답변

Sean de Wolski
Sean de Wolski 2014년 6월 9일
편집: Sean de Wolski 2014년 6월 9일
sub2ind is slow, if you want performance, use a for-loop.
% Data
X = randn(500,8,4); % z
Y = randi(8,500,1); % idx
% Engine
szX = size(X);
Z = zeros(szX([1 3]));
for ii = 1:szX(1)
Z(ii,:) = X(ii,Y(ii),:);
end
On my machine, the engine on here is taking about 1/1000 of a second.

추가 답변 (1개)

Dan Nussinson
Dan Nussinson 2019년 5월 10일
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

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by