4

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

4

3 回答 3

3

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

C(idx) = {};

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

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

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

于 2013-01-15T15:19:29.777 回答
1

创建一个检查您的状况的函数:

function state = CheckElement(element)

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

end

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

indices = cellfun(@CheckElement,myCellArray);
cellArray(indices ) = [];
于 2013-01-15T15:20:46.220 回答
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 single? (不可逆,det = 0)

于 2013-01-15T15:20:05.257 回答