我有一个单元格数组,每个单元格都是一个 n×n 矩阵。我想删除inv(cell{i}'*cell{i})
警告矩阵接近奇异的单元格。谢谢
问问题
1767 次
3 回答
3
一般来说,删除元素是容易的部分。如果C
是您的数组,则可以通过以下方式删除向量中索引指定的单元格idx
:
C(idx) = {};
关于您的具体问题,可以检查矩阵是否“几乎”单数rcond
(如果结果接近于零,则可能是单数)。要将其应用于所有单元格,您可以通过cellfun
以下方式使用:
idx = cellfun(@(x)(rcond(x' * x) < 1e-12), C);
根据自己的喜好调整阈值。结果idx
是一个逻辑数组,1
s 位于奇异矩阵的位置。如上所示,用于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 回答