【问题标题】:Delete rows and columns of a matrix删除矩阵的行和列
【发布时间】:2015-07-30 13:51:31
【问题描述】:

我有下面的矩阵:

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

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

    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);
    

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

    【讨论】:

      【解决方案2】:

      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,:)
      

      【讨论】:

      • 我相信您的第一行代码中有一个拼写错误的 ':'。
      • @AndrasDeak 谢谢,如果您发现类似的明显错误,请随时编辑答案。
      • 我刚刚意识到您的解决方案不仅更快(这对我来说是新的),而且可以在一个命令中解决提问者的全部问题:同时删除行和列。分配给[] 后,您只能分两步完成,因为要删除的对象不是数组。好的,你可以使用sub2ind,但这太混乱了。
      • 我同意你的意见,即一次进行抑制,但我们需要做更多的工作来一次抑制一些行和一些列。
      • @Dan ...我错过了这个很明显...现在一定很累了。好的,现在运行测试。谢谢!
      猜你喜欢
      • 2019-07-08
      • 2016-05-26
      • 2021-05-17
      • 2020-01-25
      • 1970-01-01
      • 2011-05-09
      • 2020-01-07
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多