Supongamos que tengo D, una matriz de datos X-por-Y-por-Z. También tengo M, una matriz de "enmascaramiento" X-por-Y. Mi objetivo es establecer los elementos (Xi, Yi, :) en D a NaN cuando (Xi, Yi) en M es falso.¿Cómo puedo indexar una matriz 3-D con una máscara 2-D en MATLAB?
¿Hay alguna manera de evitar hacer esto en un bucle? He intentado utilizar ind2sub
, pero que falla:
M = logical(round(rand(3,3))); % mask
D = randn(3,3,2); % data
% try getting x,y pairs of elements to be masked
[x,y] = ind2sub(size(M),find(M == 0));
D_masked = D;
D_masked(x,y,:) = NaN; % does not work!
% do it the old-fashioned way
D_masked = D;
for iX = 1:size(M,1)
for iY = 1:size(M,2)
if ~M(iX,iY), D_masked(iX,iY,:) = NaN; end
end
end
Sospecho que me falta algo obvio aquí. (:
ah, por supuesto, eso funciona. para las dimensiones gigantes de D y M, aunque todavía puede ser conveniente no tener que replicarlo ... –
@Matt: Dado que 'M' es una matriz lógica, solo usa 1 byte por elemento, por lo que su replicación no se usará casi tanta memoria como matrices duplicadas de dobles. De hecho, la versión replicada de 'M' usará solo 1/8 de la memoria total que' D' hace. – gnovice
@Matt: para completar, agregué otra solución que evita la replicación de 'M'. Si solo hay unos pocos valores cero en una matriz "M" muy grande, esta nueva solución puede ser más deseable desde el punto de vista del uso de la memoria. – gnovice