Array Indexing using logicals in higher dimensions

5 views (last 30 days)
I have a 3D array: A = 10x10x100 where the 2D data (10x10) is stacked in the 3rd dimension.
I am using a logical mask: B which is 10x10 and has 1s at the locations where I want to access the data in every 2D slice of the 3D array.
I would like to use the logical mask to access the data from each 2D slice and perform some simple operations - such as compute mean - for all slices (in the 3rd dimension). I am currently using a for loop as below.
for i = 1:size(A,3)
temp = A(:,:,i);
mean_out(i) = mean(temp(B));
end
Is it possible to achieve this without a for loop?
Thanks.

Accepted Answer

Ameer Hamza
Ameer Hamza on 20 May 2020
Edited: Ameer Hamza on 20 May 2020
Try this
mean_val = squeeze(mean(A.*B, [1 2]))
Similarly
squeeze(max(A.*B, [], [1 2])) % maximum value
squeeze(min(A.*B, [], [1 2])) % minimum value
  4 Comments
AP
AP on 20 May 2020
Edited: AP on 20 May 2020
Thanks, this works for me. I made the mask itself NaNs to make it more general.
B = double(B); B(B==0) = nan;
mean_val = squeeze(nanmean(A.*B, [1 2]))
Ameer Hamza
Ameer Hamza on 20 May 2020
In that case try
A = rand(10,10,100);
B = rand(10,10)>0.5;
mask = repmat(B, 1, 1, size(A,3));
M = A;
M(mask) = nan;
mean_val = nanmean(M, [1 2])

Sign in to comment.

More Answers (0)

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Products


Release

R2019a

Community Treasure Hunt

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

Start Hunting!