2010-04-29 133 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