2016-09-29 92 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

要素をシフトする必要があるため、解決策は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).' 

私はそれが問題を解決だと思うあなたは本当にあなたが "何を意味するか定義していないことに...

関連する問題