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