2012-07-10 77 views
8

我正在尋找一個優雅的解決方案來解決這個非常簡單的問題。假設我有一個矩陣MATLAB:提取邏輯索引的子矩陣

>> M = magic(5) 

M = 

    17 24  1  8 15 
    23  5  7 14 16 
    4  6 13 20 22 
    10 12 19 21  3 
    11 18 25  2  9 

和形式

I = 

    0  0  0  0  0 
    0  1  1  0  0 
    0  1  1  0  0 
    0  0  0  0  0 
    0  0  0  0  0 

的邏輯變量如果我嘗試檢索的M關聯1數值的元素在I,我得到一個列向量

>> M(I) 

ans = 

    5 
    6 
    7 
    13 

從這個邏輯索引中獲得矩陣[5 7 ; 6 13]的最簡單方法是什麼?

如果我知道I的非零元素的形狀,我可以在索引後使用重塑,但這不是一般情況。

此外,我知道在MATLAB中這種類型的索引的默認行爲強制執行一致性,其中I中的非零值不構成矩陣,但我想知道是否存在簡單這個特殊情況的解決方案。

回答

11

這是執行此操作的一種方法。假定I的所有行具有相同數量的行。還假定I的所有列都具有相同的數字,因爲Submatrix必須是矩形的。

%# Define the example data. 

M = magic(5); 
I = zeros(5); 
I(2:3, 2:3) = 1; 

%# Create the Submatrix. 

Submatrix = reshape(M(find(I)), max(sum(I)), max(sum(I'))); 
2
M = magic(5); 
I = [ ... ]; 

ind = find(I); %# find indices of ones in I 
[y1, x1] = ind2sub(size(M), ind(1)); %# get top-left position 
[y2, x2] = ind2sub(size(M), ind(end)); %# get bottom-right position 
O = M(y1:y2, x1:x2); %# copy submatrix 
3

這裏是一個非常簡單的解決辦法:

T = I(any(I'),any(I)); 
T(:) = M(I); 
+0

正是我所要回答:-) – 2015-03-17 22:36:34

+0

這不起作用永諾,例如當不對稱時。 – rst 2016-04-05 09:02:05

+0

@RobertStettler如果你的意思是'I'不能隨機產生,這是真的,但看看這個問題我認爲這是一個合理的限制。如果你的意思是別的:我不明白symetry是如何相關的,你可能會舉出一個解決方案失敗的例子嗎? (輸入矩陣,輸出,預期輸出)。 – 2016-04-06 12:34:35