假设我有一个X×Y×Z的数据矩阵D,还有一个X×Y的掩码矩阵M。我的目标是,当M中的(Xi,Yi)为false时,将D中的元素(Xi,Yi,:)设置为NaN。
有没有办法避免使用循环来达到这个目的?我尝试使用ind2sub
,但失败了:
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
我怀疑我在这里漏掉了一些显而易见的东西。(:
M
是一个逻辑矩阵,每个元素只使用1个字节,因此复制它不会像复制双精度矩阵那样占用太多内存。实际上,复制后的M
版本仅使用D
总内存的1/8。 - gnoviceM
的复制。如果一个非常大的矩阵M
中只有很少的零值,从内存使用的角度来看,这个新的解决方案可能更加理想。 - gnovice