C++で書いた簡単なコレスキーコードをテストしたかったのです。したがって、ランダムな下三角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を因数分解できないことを意味します。ランダム性によってランクが不足している行列が生成されると思います。私は正しいですか?
アップデート:
以下のMalifeが指摘しているように、次のMatlabコードが機能しているように見えることを忘れました。
N=200; L=rand(N, N); A=L*L'; [lc,p]=chol(A,'lower'); p
違いは、Lは最初のコードでは下三角であり、2番目のコードではないことです。なぜそれが重要なのですか?
また、正値半数行列を生成するための簡単なアルゴリズムを読んだ後、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で起こっているのか分かりません。何か案は?
ありがとう、
ナイルシュ。