代码之家  ›  专栏  ›  技术社区  ›  Pyrolistical

如何使用matlab中的数组掩码缩小矩阵?

  •  4
  • Pyrolistical  · 技术社区  · 14 年前

    这似乎是我的一个常见问题:

    data = [1 2 3; 4 5 6];
    mask = [true false true];
    
    mask = repmat(mask, 2, 1);
    
    data(mask) ==> [1; 4; 3; 6]
    

    我想要的是 [1 3; 4 6] .

    是的,我可以 reshape 尺寸合适,但这样做似乎是错误的。有更好的方法吗?为什么不呢 data(mask) 当矩阵实际上是矩形的时候返回它?我知道在一般情况下,它可能不是,但在我的情况下,因为我的原始遮罩是一个数组,它总是会是。

    推论的

    谢谢你的回答,我还想指出这也适用于任何返回数字索引的 ismember , sort unique

    我以前从 分类 当您可以使用这个概念一次完成它时,手动将它应用到每一列。

    1 回复  |  直到 14 年前
        1
  •  12
  •   gnovice    14 年前

    这将为您提供您想要的:

    >> data = [1 2 3; 4 5 6];
    >> mask = [true false true];
    >> data(:,mask)
    
    ans =
    
         1     3
         4     6
    

    这是因为您可以简单地应用逻辑索引 mask 到列,选择 : .

    即使使用二维逻辑数组作为输入,输出也将是索引值的列数组。这是因为无法保证索引元素可以组织成二维(即矩形)输出。考虑一下你的二维面具是否如下:

    mask = [true false true; true false false];
    

    这将索引3个值,这些值只能组织为输出的行或列向量。下面是另一个例子:

    mask = [true true true; true false false];
    

    这将索引4个值,但3个来自第一行,1个来自第二行。这些值应该如何形成矩形输出矩阵?由于对于任意的二维索引矩阵,通常没有明确的方法可以做到这一点,因此会返回索引值的列向量。