Extracting data from non-uniform levels in 3D array
1 view (last 30 days)
Show older comments
I have been trying to do this for a week and have had no hope. Maybe somebody has done it before and has some tips!
I have two 3-D arrays
Array "A": 207x177x18 array. It is a temperature data raster with 18 vertical levels.
Array "B": 207x177x18 array of zeros, with 1 values at the vertical level I am interested in for each raster point.
I want to use Array B as a mask for Array A, so that I get the 2D Matrix "C", a 207x177 raster with only the data from the vertical level I am interested in.
Any tips would be appreciated!!
0 Comments
Accepted Answer
Sean de Wolski
on 12 Sep 2012
Edited: Sean de Wolski
on 12 Sep 2012
Assuming that each row/col position of B has exactly one 1 throughout its depth, then this can be done like follows:
%An A
A = repmat(magic(10),[1 1 5]);
%Simulate a B where each row/col pair has exactly one true value through
%depth
B = false(size(A));
[~,idx] = max(rand(size(A)),[],3);
[rr, cc] = ndgrid(1:size(A,1),1:size(A,2));
B(sub2ind(size(B),rr(:), cc(:), idx(:))) = true;
%Check it
assert(all(all(sum(B,3)==1)))
%Now, how do we undo the above?
[~,idx] = max(B,[],3); %which page?
C =reshape(A(sub2ind(size(B),rr(:), cc(:), idx(:))),size(idx)); %rr/cc from above, reshape to original shape
%Check it
assert(isequal(C,magic(10)));
And of course doc sub2ind will be your friend.
More Answers (0)
See Also
Categories
Find more on Logical in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!