1 回答

TA貢獻1799條經驗 獲得超6個贊
LDL 分解算法僅適用于 Hermitian/對稱矩陣。您正在向它傳遞一個具有隨機值的矩陣,該矩陣不太可能是對稱的。此外,矩陣乘法應該在不將置換矩陣應用于下三角矩陣的情況下進行。
將非對稱矩陣傳遞給 時scipy.linalg.ldl,僅引用矩陣的下三角部分或上三角部分,具體取決于lower關鍵字參數的值,默認為True。我們可以看到這樣做的效果np.isclose():
>>> x = np.random.randn(5,5)
>>> l, d, p = la.ldl(x)
>>> np.isclose(l.dot(d).dot(l.T) - x, 0)
[[ True False False False False]
[ True True False False False]
[ True True True False False]
[ True True True True False]
[ True True True True True]]
在這里,我們看到矩陣的上三角部分被假定為對稱的,因此算法返回的值在這種情況下是正確的。
下面,我們傳遞la.ldl一個實際的對稱矩陣,得到預期的結果。
>>> x = np.array([[1, 2, 3],
[2, 4, 5],
[3, 5, 6]])
>>> l, d, p = la.ldl(x)
>>> print(np.isclose(l.dot(d).dot(l.T) - x, 0))
[[ True True True]
[ True True True]
[ True True True]]
如果您正在尋找一般的 LDL^T 分解,而沒有 permutations,這將進一步減少矩陣的域。您的矩陣也需要是正定的。
下面是一個這樣的矩陣示例:
>>> x = np.array([[2, -1, 0],
[-1, 3, -1],
[0, -1, 4]])
>>> l, d, p = la.ldl(x)
>>> l
array([[ 1. , 0. , 0. ],
[-0.5, 1. , 0. ],
[ 0. , -0.4, 1. ]])
>>> d
array([[2. , 0. , 0. ],
[0. , 2.5, 0. ],
[0. , 0. , 3.6]])
>>> p
array([0, 1, 2], dtype=int64)
如您所見,排列p是[0, 1, 2],并且l已經是下三角形。
添加回答
舉報