4

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

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,sortunique.

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

4

1 回答 1

12

这会给你你想要的:

>> 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 个来自第二行。这些值应该如何形成一个矩形输出矩阵?由于对于任意二维索引矩阵通常没有明确的方法来执行此操作,因此返回索引值的列向量。

于 2010-04-29T17:55:13.507 回答