【发布时间】:2022-01-02 06:54:36
【问题描述】:
我正在尝试将一些伪代码从 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,而且我通常缺乏编码技能,但我根本没有得到任何正确的答案,而且我不知道我哪里出错了。
我在这里添加了一个我正在使用的示例矩阵,并且这个 应该 适用于,并且应该给出适当的 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.]]
【问题讨论】:
-
AHHH 对不起,我打字太匆忙了,哈哈
-
你能帮我找出是什么让我的代码给了我错误的答案吗? ://
-
您要比较的分解也是 Cholesky 还是一般的 LU?在后一种情况下,两者的不同之处在于对角线的缩放。
-
不,不,我将其与 numpy linalg Cholesky 分解(我也手动计算)进行了比较,虽然 numpy 与我得到的相同,但这个给了我一个不正确的回答,但我不完全确定为什么。如果有帮助,我将编辑我的帖子并添加我从两种方法中获得的解决方案/分解以显示差异。
标签: python math matrix linear-algebra