【发布时间】:2015-07-30 13:51:31
【问题描述】:
我有下面的矩阵:
a = [1 2 1 4;
3 4 9 16;
0 0 -2 -4;
0 0 -6 -8]
如何任意删除任何给定的行或列?例如上述矩阵的第二行和第三列?
【问题讨论】:
标签: matlab
我有下面的矩阵:
a = [1 2 1 4;
3 4 9 16;
0 0 -2 -4;
0 0 -6 -8]
如何任意删除任何给定的行或列?例如上述矩阵的第二行和第三列?
【问题讨论】:
标签: matlab
只需将列或行分配给空矩阵:
a(2,:) = [];
a(:,3) = [];
注意:我将other solution 与我的比较,按照里面的链接。在一个大数组(创建为 rand(1e4))和 10 次运行中,我删除了 2 列和 2 行,空矩阵分配的平均时间为 0.932 毫秒,保留行(或列)的平均时间为 0.905 毫秒任务。所以那里看到的差距没有链接中提到的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);
在这个测试中,它显然比分别对行和列执行抑制快两倍。
【讨论】:
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,:)
【讨论】:
[] 后,您只能分两步完成,因为要删除的对象不是数组。好的,你可以使用sub2ind,但这太混乱了。