我有以下矩阵:
a = [1 2 1 4;
3 4 9 16;
0 0 -2 -4;
0 0 -6 -8]
如何随意删除任何给定的行或列?例如上述矩阵的第二行和第三列?
答案 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,:)