我正在使用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
答案 0 :(得分:3)
如果您的矩阵C
通常是'非奇异和mrdvide
比pinv
快得多,然后您可以尝试mrdivide
,然后抓住警告切换到pinv
。
但是,在MATLAB中,我们无法使用try
来捕获警告。幸运的是,有undocumented solution来发出警告。
基本想法是将warning
转为error
以获取您将拥有的特定警告ID(在您的情况下为MATLAB:singularMatrix
),然后使用try
和{{1 }}
catch