2013-01-15 56 views

回答

3

一般来说,删除元素是很容易的部分。如果C是你的阵列,除去指数以向量idx指定单元格可以这样做:

C(idx) = {}; 

关于你提到的具体问题,检查一个矩阵是“几乎”单数或不能够与rcond来完成(如果结果接近零,则可能是单数)。将它应用到你可以通过以下方式使用cellfun所有单元格:

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

调整阈值,根据自己的喜好。得到的idx是一个逻辑数组,在奇异矩阵的位置上有1 s。如上所示,使用idxC中删除这些元素。

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)

+1

T他'''和'*'操作符没有为单元数组定义,所以你会为'c''和'c' * c'部分触发一个错误。另外,我不确定你实际上是否必须计算'inv' ...我认为这是'c'* c'结果可以是单数。 –

+0

@EitanT,噢,我完全搞砸了。实际上我不得不用一个匿名函数来包装它以获得所需的行为 – slayton

+0

我仍然认为'inv'是不必要的。 –

1

创建检查您的病情功能:

function state = CheckElement(element) 

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

end 

然后在您所有的细胞阵列元素上做cellfun,如下所示:

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

在计算时,你不需要'UniformOutput',false'部分'indices'。你希望索引是一个矩阵,而不是单元阵列。 –

+0

@EitanT ..非常感谢,修复了代码。 –

+0

没问题。有+1。 –

相关问题