2016-09-29 222 views
1

假設我在MATLAB中有一個矩陣。從MATLAB中的矩陣中去除任意列中的元素

>> m = [1 2 3; 4 5 6; 7 8 9] 

m = 

    1  2  3 
    4  5  6 
    7  8  9 

我有指數列表,我想從基質除去這些索引元素。

索引可能屬於任意行或列。不過,我可以保證,如果我要從一行中刪除一個元素,我必須從其他所有行中刪除一個元素。

一旦所有元素被刪除,矩陣中的任何「空白」都應該通過將元素移到左側來解決。

% for example, removing m(1, 1), m(2, 2), m(3, 3) should yield 
m = 

    2  3 
    4  6 
    7  8 

% it will NOT yield the following because the elements were shifted up, not to the left. 
M = 

    4  2  3 
    7  8  6 

% removing only m(1, 1) would also be invalid, 
% because I must remove an element from all other rows. 

對任意數量的索引執行此操作最有效的方法是什麼?

+0

的問題是,在曖昧的你並不真正定義您通過一個意思「有效矩陣「。解決方案'[4,2,3; 7,8,6]'是否也是有效的解決方案?你是否保證從每行和每列中刪除相同數量的元素? – Dave

+0

@Dave我明白你的意思。起初我並沒有考慮過這個問題,因爲這要引起我的注意。我澄清了我的問題。希望能消除歧義。 – Zsw

回答

2

隨着您需要向上移動的元素,解決方案是一個兩步驟。首先轉置矩陣,刪除相應的元素,然後重新整形並轉置結果。 (如果允許升檔,那麼你不需要轉置)。假設索引存儲在一個矩陣,remove,則:

m=[1,2,3;4,5,6;7,8,9]; 
remove=[1,1;2,2;3,3]; 
copy=m.'; 
width=size(copy,2); 
copy(sub2ind(size(copy),remove(:,2),remove(:,1)))=[]; 
m=reshape(copy,[],width).' 

我認爲解決問題...

相關問題