Array Indexing using logicals in higher dimensions

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.

 采纳的回答

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 个评论

Thanks Ameer, but I want to exclude the 0s from the mean.
squeeze(mean(nonzeros(A.*repmat(B,[1,1,size(A)])), [1 2])) does not work either because nonzeros reduces the array to a column.
Try this. It replaces 0s with nan and then uses nanmean()
A = rand(10,10,100);
B = rand(10,10)>0.5;
M = A.*B;
M(M==0) = nan;
mean_val = squeeze(nanmean(M, [1 2]))
Also, it does not reduce the matrix to the column. It calculates the mean of each 3D slice separately. I used squeeze() to convert the final answer to a column matrix. You can run it without squeeze, and you will get a 3D matrix
mean_val = nanmean(M, [1 2])
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]))
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])

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Matrices and Arrays 的更多信息

产品

版本

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by