这似乎是我的一个非常普遍的问题:
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
。
我曾经从sort
获取第二个返回值并手动将其应用于每个列,当你可以使用这个概念一次性完成。
答案 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索引矩阵一般没有明确的方法来执行此操作,因此会返回索引值的列向量。