我想测试我用 C++ 编写的一个简单的 Cholesky 代码。所以我正在生成一个随机的下三角 L 并乘以它的转置来生成 A。
A = L * Lt;
但是我的代码没有考虑 A。所以我在 Matlab 中尝试了这个:
N=200; L=tril(rand(N, N)); A=L*L'; [lc,p]=chol(A,'lower'); p
这输出非零 p,这意味着 Matlab 也无法分解 A。我猜测随机性会生成秩不足的矩阵。我对吗?
更新:
我忘了提到下面的 Matlab 代码似乎可以正常工作,正如 Malife 在下面指出的那样:
N=200; L=rand(N, N); A=L*L'; [lc,p]=chol(A,'lower'); p
不同之处在于 L 在第一个代码中是下三角形而不是第二个。为什么这很重要?
在阅读了用于生成正半定矩阵的简单算法之后,我还尝试了以下 scipy :
from scipy import random, linalg
A = random.rand(100, 100)
B = A*A.transpose()
linalg.cholesky(B)
但它出错了:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/scipy/linalg/decomp_cholesky.py", line 66, in cholesky
c, lower = _cholesky(a, lower=lower, overwrite_a=overwrite_a, clean=True)
File "/usr/lib/python2.7/dist-packages/scipy/linalg/decomp_cholesky.py", line 24, in _cholesky
raise LinAlgError("%d-th leading minor not positive definite" % info)
numpy.linalg.linalg.LinAlgError: 2-th leading minor not positive definite
我不明白为什么 scipy 会发生这种情况。有任何想法吗?
谢谢,
尼莱什。