如何识别Matrix在Matlab

时间:2017-01-06 09:00:36

标签: matlab matrix linear-algebra

我正在使用MATLAB进行计算条件协方差,并且使用高斯混合模型,它总是与Schur complement相关。在Wiki中建议,如果矩阵C是单数,则C的广义逆可用于计算Schur补。

在MATLAB中,pinv就是为了这个目标。由于我的矩阵非常大(超过1000列)并且会产生尺寸为> 1000*1000的协方差矩阵,因此使用eig代替svd来计算{{pinv要快得多1}}。然而,这会因为它在设定的阈值下截断对应于小特征值的特征向量而失去显着的精度。

另一种方法是使用rmdivide函数将BC^(-1)计算为B/C,因为矩阵的逆可以被视为最小二乘问题。在我的问题中,这可以获得更高的精度,并且运行速度比使用B*pinv(C)快得多。此外,rmdivide可以处理一些奇异矩阵,因此,这种方法是优选的。但在某些情况下会出现警告Matrix is singular to working precision,如果使用NaNs则会导致rmdivide。那么,有没有办法确定何时会出现此警告,因此我可以使用pinv代替?

更新

除了@ Dohyun的回答之外,我现在要做的是检查获得的结果,基于如果矩阵是单数的话,可以在结果中获得NaN的事实。

warning('off','MATLAB:singularMatrix')
x = b/C; % in my codes, vector is obtained, I think matrix can also be checked in this way
if isnan(sum(x))
    x = b*pinv(C);
end

1 个答案:

答案 0 :(得分:3)

如果您的矩阵C通常是'非奇异和mrdvidepinv快得多,然后您可以尝试mrdivide,然后抓住警告切换到pinv

但是,在MATLAB中,我们无法使用try来捕获警告。幸运的是,有undocumented solution来发出警告。

基本想法是将warning转为error以获取您将拥有的特定警告ID(在您的情况下为MATLAB:singularMatrix),然后使用try和{{1 }}

catch