【问题标题】:How to identify Matrix is singular to working precision in Matlab如何识别矩阵对于 Matlab 中的工作精度来说是奇异的
【发布时间】:2017-01-06 09:00:36
【问题描述】:

我正在使用 MATLAB 来计算条件协方差和使用高斯混合模型的均值,这始终与 Schur complement 有关。在Wiki 中建议如果矩阵C 是奇异矩阵,则可以使用C 的广义逆来计算舒尔补。

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

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

【问题讨论】:

    标签: matlab matrix linear-algebra


    【解决方案1】:

    如果您的矩阵C“通常”是非奇异矩阵并且mrdvidepinv 快​​得多,那么您可以尝试mrdivide,然后捕获警告以切换到pinv

    但是,在 MATLAB 中,我们无法使用 try 捕获警告。幸运的是,有undocumented solution 可以捕捉到警告。

    基本思路是将warning 转为error 以获得您将拥有的特定警告ID(在您的情况下为MATLAB:singularMatrix),然后使用trycatch

    myWarn = warning('error','MATLAB:singularMatrix'); % turn singular matrix warning to error
    try
        u = mrdivide(B,C);
    catch
        u = B*pinv(C);
    end
    warning(myWarn); % return to warning
    

    【讨论】:

    • +1!小幅改进:最好使用ws = warning('error', ...),最后使用warning(ws);。这样,警告状态将重置为操作之前的状态,而不是强制它'on'
    • 谢谢,这是个好主意。但我不喜欢try ... catch ... 模式,因为如果将其插入到具有大量迭代的循环中,这会显着减慢计算速度。我已经针对我的问题更新了自己的解决方案。我认为它更直接。
    猜你喜欢
    • 2020-09-30
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多