【问题标题】:remove cells that satisfy a specific condition删除满足特定条件的单元格
【发布时间】:2013-01-16 07:07:14
【问题描述】:

我有一个单元格数组,每个单元格都是一个 n×n 矩阵。我想删除inv(cell{i}'*cell{i}) 发出警告矩阵接近奇异的单元格。 谢谢

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    一般来说,删除元素是最容易的部分。如果C 是您的数组,则可以通过以下方式删除向量idx 中索引指定的单元格:

    C(idx) = {};
    

    关于您的具体问题,可以使用rcond 检查矩阵是否“几乎”奇异(如果结果接近于零,则可能是奇异矩阵)。要将其应用于所有单元格,您可以通过以下方式使用cellfun

    idx = cellfun(@(x)(rcond(x' * x) < 1e-12), C);
    

    根据自己的喜好调整阈值。生成的idx 是一个逻辑数组,1s 位于奇异矩阵的位置。如上所示,使用idxC 中删除这些元素。

    【讨论】:

      【解决方案2】:

      创建一个检查您的条件的函数:

      function state = CheckElement(element)
      
      if ([condition])
         state = 1;
      else
         state = 0;
      end
      
      end
      

      然后对所有单元格数组元素执行 cellfun,如下所示:

      indices = cellfun(@CheckElement,myCellArray);
      cellArray(indices ) = [];
      

      【讨论】:

      • 计算indices 时不需要'UniformOutput', false 部分。您希望索引是矩阵,而不是元胞数组。
      【解决方案3】:

      假设您已经定义了 issingular 函数,您可以使用 cellfun 来获取包含要删除的矩阵的单元格的索引。

      c; % cell arry
      
      singularIdx = cellfun((@x) issingular( inv(x' * x)), c);  %' added single quote for SO syntax
      
      cFiltered = c(~singluarIdx);
      

      您可能需要编写自己的函数来检查奇点,有关更多信息,请参阅此问题:Fast method to check if a Matrix is singular? (non-invertible, det = 0)

      【讨论】:

      • '* 运算符未针对元胞数组定义,因此您将触发 c'c' * c 部分的错误。另外,我不确定您是否真的必须计算 inv... 我认为 c'*c 结果可以是单数。
      • @EitanT,哦,是的,我完全搞砸了。我实际上不得不将它包装在一个匿名函数中以获得所需的行为
      • 我仍然认为inv 是不必要的。
      • @EitanT,是的,你可能是对的,我只是在回应 OP 中的原始代码
      • 起初,我也在做同样的事情 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      相关资源
      最近更新 更多