【发布时间】: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