accessing indexed values in a 3D array
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Chad Greene
am 27 Jul. 2015
Kommentiert: Chad Greene
am 27 Jul. 2015
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.
0 Kommentare
Akzeptierte Antwort
David Young
am 27 Jul. 2015
[rows, cols] = ndgrid(1:size(Z,1), 1:size(Z,2));
Zindex = sub2ind(size(Z), rows, cols, ind);
s = Z(Zindex);
Weitere Antworten (1)
Walter Roberson
am 27 Jul. 2015
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 Kommentare
Walter Roberson
am 27 Jul. 2015
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);
Siehe auch
Kategorien
Mehr zu Resizing and Reshaping Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!