如何在MATLAB中使用数组掩码缩小矩阵?

时间:2010-04-29 17:53:23

标签: matlab arrays matrix mask reshape

这似乎是我的一个非常普遍的问题:

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)在实际为矩形时不返回矩阵?我理解在一般情况下它可能不是,但在我的情况下,因为我的原始掩码是一个数组,它总是会。

推论

感谢您的回答,我还想指出这也适用于任何返回数字索引的内容,例如ismembersortunique

我曾经从sort获取第二个返回值并手动将其应用于每个列,当你可以使用这个概念一次性完成。

1 个答案:

答案 0 :(得分:12)

这会给你你想要的东西:

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

ans =

     1     3
     4     6

这是有效的,因为您只需将逻辑索引mask应用于列,选择:的所有行。

即使将2-D逻辑数组用于输入,输出也将是索引值的列数组。这是因为不能保证索引元素可以组织成2-D(即矩形)输出。考虑一下你的2-D掩码是否如下:

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

这将索引3个值,除了输出的行或列向量之外,它们不能组织成任何东西。这是另一个例子:

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

这将索引4个值,但3个来自第一行,1个来自第二行。如何将这些值整形为矩形输出矩阵?由于对于任意2-D索引矩阵一般没有明确的方法来执行此操作,因此会返回索引值的列向量。