如何在MATLAB中使用2-D掩模索引3-D矩阵?

时间:2010-08-04 16:15:49

标签: matlab indexing matrix

假设我有一个X-by-Y-by-Z数据矩阵。我也有M,一个X-by-Y“掩蔽”矩阵。我的目标是当M中的(Xi,Yi)为假时,将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

我怀疑我在这里遗漏了一些明显的东西。 (:

3 个答案:

答案 0 :(得分:13)

您可以使用REPMAT在第三维度上复制逻辑掩码M,以使其与D的大小相同。然后,索引:

D_masked = D;
D_masked(repmat(~M,[1 1 size(D,3)])) = NaN;

如果不希望复制掩模矩阵,还有另一种选择。您可以先找到一组线性索引,其中M等于0,然后复制该组size(D,3)次,然后将每组索引移动numel(M)的倍数,使其索引不同第三维中D的一部分。我将使用BSXFUN

来说明这一点
D_masked = D;
index = bsxfun(@plus,find(~M),(0:(size(D,3)-1)).*numel(M));
D_masked(index) = NaN;

答案 1 :(得分:0)

重塑为few examples,您可以在此处使用它来获得有效的解决方案。将整个问题简化为二维问题。

sz=size(D);
D=reshape(D,[],sz(3)); %reshape to 2d
D(isnan(M(:)),:)=nan; %perform the operation on the 2d matrix
D=reshape(D,sz); %reshape back to 3d

答案 2 :(得分:-2)

我的Matlab有点生疏,但我认为逻辑索引应该有效:

D_masked = D;
D_masked[ M ] = NaN;

(可能可以在rhs上用条件表达式组合成一个语句...)