假设我在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 :(得分: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).'
我认为这解决了问题...