删除矩阵的行和列

时间:2015-07-30 13:51:32

标签: matlab

我有以下矩阵:

a = [1  2  1  4; 
     3  4  9  16; 
     0  0 -2 -4; 
     0  0 -6 -8]

如何随意删除任何给定的行或列?例如上述矩阵的第二行和第三列?

2 个答案:

答案 0 :(得分:6)

只需将列或行分配给空矩阵:

a(2,:) = [];
a(:,3) = [];

注意:我将other solution与我的内容进行比较,然后将链接放入其中。在一个大数组(创建为rand(1e4))和10次运行中,我删除2列和2行,空矩阵赋值的平均时间为0.932ms,保留行的平均时间为0.905ms(或 - 专栏)。因此,在链接中提到的差距不会大到1.5倍。总是首先执行一些基准测试:)!

编辑最快的解决方案是为行和列创建索引掩码,并使用这些掩码重新分配数组。例如:

a = rand(10000);
kr = true(size(a,1),1);
kr([72,6144]) = false;    % some rows to delete
kc = true(1,size(a,2));
kc([1894,4512]) = false;  % some columns to delete
a = a(kr,kc);

在此测试中,它明显比分别对行和列执行抑制快两倍。

答案 1 :(得分:3)

slightly more efficient way(尽管设置可能更复杂)是重新分配要保留的所有行(与将要删除的行设置为空矩阵相比)。因此,例如,如果要从矩阵中删除第5行和第7行,您可以执行

A = A([1:4, 6, 8:end],:)

A = A(setdiff(1:size(A,1), [5,7] ),:)

但最好的方法可能是使用逻辑索引(这通常是Matlab工作流程中的一个自然步骤):

idx = true(size(A,1),1);
idx([5,7]) = false;

A = A(idx,:)