sub2ind, picking specific values from a 3d matrix
3 ビュー (過去 30 日間)
古いコメントを表示
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.
0 件のコメント
採用された回答
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.
0 件のコメント
その他の回答 (1 件)
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
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Matrices and Arrays についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!