Array Indexing using logicals in higher dimensions

5 visualizaciones (últimos 30 días)
AP
AP el 19 de Mayo de 2020
Comentada: Ameer Hamza el 20 de Mayo de 2020
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.

Respuesta aceptada

Ameer Hamza
Ameer Hamza el 20 de Mayo de 2020
Editada: Ameer Hamza el 20 de Mayo de 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 comentarios
AP
AP el 20 de Mayo de 2020
Editada: AP el 20 de Mayo de 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 el 20 de Mayo de 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])

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Matrices and Arrays en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by