2010-04-29 345 views
4

这似乎是我的一个非常普遍的问题:如何在MATLAB中使用数组掩码缩小矩阵?

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

推论

感谢您的回答,我也只是想指出这也适用于任何返回类似ismembersort,或unique数字索引。

我用来从sort采取第二返回值,并手动将其应用到每一列时,你可以使用这个概念做一杆。

回答

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

+0

谢谢,我知道这是一些简单的类似。从来没有考虑过使用:带面具的概念。我只使用了一个索引。 – Pyrolistical 2010-04-29 18:06:17