2016-09-29 157 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).' 

我认为解决问题...

相关问题