Indexing into a multidemesional array using a multidimensional array

6 ビュー (過去 30 日間)
Kevin McAughey
Kevin McAughey 2016 年 11 月 18 日
コメント済み: Guillaume 2016 年 11 月 18 日
This question seems similar to a previously answered question, but I'm not sure if the answer there applies to my problem.
I have an array, X, which has dimensions k by m by n and I have another array, Y, with indices for the first dimension k, which has dimensions m by n. I want to create an output matrix of m by n of each value of X in the k dimension where the index in that k dimension corresponds to the value in Y for each value of m and n.
I know that is a bit confusing, but in essence I want to achieve the following code via clever application of indexing, rather than using nested for loops.
m = size(X,2);
n = size(X,3);
for m_count = 1:length(m)
for n_count = 1:length(n)
output(m_count,n_count) = X(Y(m_count,n_count),m_count,n_count)
end
end

採用された回答

Guillaume
Guillaume 2016 年 11 月 18 日
I think it should rather be:
[rows, columns] = ndgrid(1:size(Y, 1), 1:size(Y, 2));
output = X(sub2ind(size(X), Y, rows, columns))
  2 件のコメント
Kevin McAughey
Kevin McAughey 2016 年 11 月 18 日
This seems to work perfectly, now I'll just have to look through it so that I can understand why!
Guillaume
Guillaume 2016 年 11 月 18 日
rows and columns are just two matrices corresponding to the row and column indices of the corresponding elements of Y.
sub2ind converts these three coordinate matrices into a single linear index which can be used to index X.

サインインしてコメントする。

その他の回答 (1 件)

Jan
Jan 2016 年 11 月 18 日
編集済み: Jan 2016 年 11 月 18 日
Try this:
output = X(sub2ind(size(X), Y(:), 1:size(x,2), 1:size(x,3))
  1 件のコメント
Kevin McAughey
Kevin McAughey 2016 年 11 月 18 日
When I tried this it threw the following error:
Error using sub2ind (line 51)
The subscript vectors must all be of the same size.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by