代码之家  ›  专栏  ›  技术社区  ›  Matt Mizumi

如何在Matlab中用二维掩模索引三维矩阵?

  •  13
  • Matt Mizumi  · 技术社区  · 15 年前

    假设我有d,x-by-y-by-z数据矩阵。我还有m,一个x-by-y“掩蔽”矩阵。我的目标是把元素(Xi,Yi,:)在D到南当(西,Yi)在M是假的。

    有什么方法可以避免在循环中这样做吗?我试着用 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
    

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

    2 回复  |  直到 15 年前
        1
  •  13
  •   gnovice    15 年前

    您可以通过复制逻辑掩码来实现这一点。 M 通过第三维度使用 REPMAT 所以它的大小和 D . 然后,索引掉:

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

    如果不希望复制遮罩矩阵,则还有另一种选择。您可以首先找到一组线性索引,用于 等于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;
    
        2
  •  -2
  •   c-urchin    15 年前

    我的Matlab有点生疏,但我认为逻辑索引应该可以工作:

    D_masked = D;
    D_masked[ M ] = NaN;
    

    (可能可以将其与rhs上的条件表达式组合成一个语句…)