删除满足特定条件的单元格

时间:2013-01-15 15:12:58

标签: matlab matrix

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

3 个答案:

答案 0 :(得分:3)

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

C(idx) = {};

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

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

根据您的喜好调整阈值。结果idx是一个逻辑数组,其中1位于奇异矩阵的位置。使用idxC中移除这些元素,如上所示。

答案 1 :(得分:1)

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

function state = CheckElement(element)

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

end

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

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

答案 2 :(得分:0)

假设您已经定义了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)