【发布时间】:2013-01-16 07:07:14
【问题描述】:
我有一个单元格数组,每个单元格都是一个 n×n 矩阵。我想删除inv(cell{i}'*cell{i}) 发出警告矩阵接近奇异的单元格。
谢谢
【问题讨论】:
我有一个单元格数组,每个单元格都是一个 n×n 矩阵。我想删除inv(cell{i}'*cell{i}) 发出警告矩阵接近奇异的单元格。
谢谢
【问题讨论】:
一般来说,删除元素是最容易的部分。如果C 是您的数组,则可以通过以下方式删除向量idx 中索引指定的单元格:
C(idx) = {};
关于您的具体问题,可以使用rcond 检查矩阵是否“几乎”奇异(如果结果接近于零,则可能是奇异矩阵)。要将其应用于所有单元格,您可以通过以下方式使用cellfun:
idx = cellfun(@(x)(rcond(x' * x) < 1e-12), C);
根据自己的喜好调整阈值。生成的idx 是一个逻辑数组,1s 位于奇异矩阵的位置。如上所示,使用idx 从C 中删除这些元素。
【讨论】:
创建一个检查您的条件的函数:
function state = CheckElement(element)
if ([condition])
state = 1;
else
state = 0;
end
end
然后对所有单元格数组元素执行 cellfun,如下所示:
indices = cellfun(@CheckElement,myCellArray);
cellArray(indices ) = [];
【讨论】:
indices 时不需要'UniformOutput', false 部分。您希望索引是矩阵,而不是元胞数组。
假设您已经定义了 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 结果可以是单数。
inv 是不必要的。