我正在嘗試將一些偽代碼從 matlab 轉換為 python 腳本,但在獲得正確答案時遇到了一些麻煩?有人可以幫我找出我把翻譯搞砸的地方嗎?
我在 Trefethan & Bau 書中給出的 Cholesky 分解中給出的偽代碼是

如果我正確理解給出的描述,這是為上三角矩陣完成的,但我認為這也適用于一般矩陣,不是嗎?
無論如何,我在python中撰寫了以下代碼:
def is_SPD(A):
if np.all(A == A.T):
if np.all(la.eigvals(A) > 0):
return True
return False
def cholesky_decomp(A):
#first check if matrix is symmetric and positive definite
if is_SPD(A) == True:
R = np.copy(A)
for k in range (0, len(A)):
for j in range (k 1, len(A)):
R[j,j:] = R[j,j:] - (R[k,j:]*(R[k,j]/R[k,k]))
R[k,k:] = R[k,k:]/sqrt(R[k,k])
return R
else:
return print('Cholesky decomposition not applicable')
我正在處理一個 4x4 矩陣,我已經通過 np.linalg 方法進行了分解,我的答案完全不同。
我想這可能嗎?是因為我不熟悉 MATLAB 并且我缺乏一般的編碼技能,但我根本沒有得到任何正確的答案,我無法弄清楚我哪里出錯了。
我在這里增加一個樣品基質,我使用,并認為這shoulddd適用于,并且應該給一個適當的Cholesky分解,但我發現了一個完全不正確的答案。
有人可以用它來幫助我找出我哪里出錯了嗎?
A = np.array([[16, -12, -12, -16], [-12, 25, 1, -4], [-12, 1, 17, 14], [-16, -4, 14, 57]])
我的代碼給了我:
[[ 4 -3 -3 -4]
[-12 4 -2 -4]
[-12 1 2 -3]
[-16 -4 14 4]]
而 numpy Cholesky 函式給了我:
[[ 4. 0. 0. 0.]
[-3. 4. 0. 0.]
[-3. -2. 2. 0.]
[-4. -4. -3. 4.]]
uj5u.com熱心網友回復:
您的代碼正確地實作了所述演算法,但請注意文字說明(強調):
輸入矩陣A表示要分解的m × m Hermitian 正定矩陣的超對角線一半。
所以你需要替換輸入A,
[[ 16 -12 -12 -16]
[-12 25 1 -4]
[-12 1 17 14]
[-16 -4 14 57]]
作者np.triu(A):
[[ 16 -12 -12 -16]
[ 0 25 1 -4]
[ 0 0 17 14]
[ 0 0 0 57]]
此外(符號略有變化,其中'表示 Hermitian 轉置),
輸出矩陣R表示A = R ' R的上三角因子
所以你得到一個上三角R,而 Numpy 的cholesky函式給出一個下三角結果。這些結果中的每一個都只是另一個的 Hermitian 轉置版本(請參閱此處)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/364971.html
上一篇:遞回計算x是否是b的冪
