how to use bsxfun or arrayfun to build the following matrix
2 ビュー (過去 30 日間)
古いコメントを表示
Hi, there.
I want to use bsxfun or arrayfun to replace the following for loop.
for s=1:S
New_P(s,:)=P(s,:,U0(s));
end;
for example,
if P(:,:,1)=[1,2;3,4];
P(:,:,2)=[5,6;7,8];
U0=[1;2];
then the final result is New_P=[1,2;7,8];
Thank you in advance!
2 件のコメント
Adam
2016 年 2 月 25 日
Is there any particular reason why you want to use arrayfun or bsxfun? arrayfun is generally slower than a for loop and is also more suited to 1d arrays than multidimensional arrays. It can certainly be used for multidimensional arrays, but it effectively just interprets it as a 1d array anyway using linear indexing on the array.
I'm not aware of a syntax of bsxfun that would be useful for this, though maybe it is. I use it for certain specific tasks so haven't used all its capabilities.
採用された回答
Guillaume
2016 年 2 月 25 日
P = cat(3, [1 2;3 4], [5 6;7 8]);
U0 = [1;2];
New_P = P(sub2ind(size(P), ...
repmat((1:size(P, 1))', 1, size(P, 2)), ... rows where to pick the elements
repmat(1:size(P, 2), size(P, 1), 1), ... columns where to pick the elements
repmat(U0, 1, size(P, 2)))) %pages where to pick the elements
1 件のコメント
Guillaume
2016 年 2 月 25 日
Note that you could generate the rows and columns matrix with ngrid if you prefer:
[rows, cols] = ndgrid(1:size(P, 1), 1:size(P, 2));
new_P = P(sub2ind(size(P), rows, cols, repmat(U0, 1, size(P, 2))))
その他の回答 (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!