2013-05-22 53 views
4

在Matlab中检查矩阵是否对称正定的最快方法(运行时间)是什么?我已经对大小(维度)从10000到100000变化的大量稀疏矩阵运行此测试?检查矩阵是否为SPD

编辑:

乔莱斯基是我的目的,如愿昂贵。我需要一个肮脏的检查,如果它表明矩阵可能是spd,那么我可能只使用CHOL更可靠地检查那些矩阵

回答

3

如上所述here,您可以使用chol函数来检查矩阵是否为PD。

CHOL函数提供了一个可选的第二个输出参数“p” ,如果发现矩阵是正定的,则​​该参数为零。如果CHOL 函数仅提供一个 输出参数,并且还给定了非确定的正数 矩阵,则会返回错误。注意:CHOL期望其输入矩阵是对称的,只有 看矩阵的上三角部分。

至于对称性,你可以使用下面的功能:

issym = @(m) isequal(tril(x), triu(x)'); 
+0

cholesky对我的目的来说过于昂贵。我首先需要一个脏检查,如果它表明矩阵可能是spd,那么我可以更可靠地使用CHOL来检查那些矩阵 – zimbra314

+1

如果你想要一个初步的脏检测,直接使用正定性判据:检查v'* A * v表示使得计算速度非常快的几个向量v。对于某些向量,这相当于检查矩阵中的单个元素。 –

1

我想你可以看看你的矩阵的特征值,并检查他们是否是完全不同的和真正的价值。

您可能,因此,想调用eig功能如下:

[V,D] = eig(A) 

我希望这有助于

2

我认为这是一个不平凡的问题,有效地做到这一点。如果矩阵不是正定的,Cholesky算法将会失败,所以最好实现自己,这也有一个好处,那就是当算法失败时可以控制该做什么,因为输入不是肯定的。我使用C#而不是Matlab来进行数学编程,而我的Cholesky实现只是少数几行,所以并不困难。如果您使用别人的算法,那么取决于它是如何实现的,如果您输入非对称矩阵,则可能会导致误导结果,因为某些实现假定矩阵是对称的。我能想到的唯一的快速预测试就是检查the matrix trace,如果矩阵是SPD,这将是正面的。