MATLAB: Accessing indexed values in a 3D array

3d indexing

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 3×4 grid. For each point in the 3×4 grid I have an index that correspond to a slice the third dimension:
ind = randi(8,[3 4])
How do I create a 3×4 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.

Best Answer

[rows, cols] = ndgrid(1:size(Z,1), 1:size(Z,2));
Zindex = sub2ind(size(Z), rows, cols, ind);
s = Z(Zindex);
Related Question