accessing indexed values in a 3D array

1 次查看(过去 30 天)
I have a 3D array of temperature data that looks like this:
Z = rand(3,4,8);
It contains 8 slices of data on a 3x4 grid. For each point in the 3x4 grid I have an index that correspond to a slice the third dimension:
ind = randi(8,[3 4])
How do I create a 3x4 surface of values in Z given by the indices ind? I could do it manually like this:
s(1,1) = Z(1,1,ind(1,1));
s(1,2) = Z(1,2,ind(1,2));
s(1,3) = Z(1,3,ind(1,3));
...
s(3,4) = Z(3,4,ind(3,4));
But my Z matrix is 500x500x100, so doing it manually is out of the question. I'm sure I can avoid a loop here somehow.

采纳的回答

David Young
David Young 2015-7-27
[rows, cols] = ndgrid(1:size(Z,1), 1:size(Z,2));
Zindex = sub2ind(size(Z), rows, cols, ind);
s = Z(Zindex);

更多回答(1 个)

Walter Roberson
Walter Roberson 2015-7-27
Zs = size(Z);
S = zeros(Zs(1), Zs(2));
ind_offset = (ind - 1) * Zs(1) * Zs(2) + (1:numel(S));
S(1:numel(S)) = Z(ind_offset);
  2 个评论
Walter Roberson
Walter Roberson 2015-7-27
I made a mistake in the above. Also after seeing David's perfectly workable answer I would improve mine:
Zs = size(Z);
ind_offset = (ind - 1) * Zs(1) * Zs(2) + reshape(1:Zs(1)*Zs(2),Zs(1),Zs(2));
S = Z(ind_offset);

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by