如何理解scipy.linalg.lu_factor的pivot矩阵?

时间:2014-09-19 08:29:27

标签: python numpy scipy

如何手动重建由lu_factor分解的矩阵 A ? ( A = PLU

由于矩阵 P 的设置,我当前的尝试都失败了。以下是我到目前为止的情况:

A = np.random.rand(3,3)
lu, piv = lu_factor(A)

U = np.triu(lu)
L = np.tril(lu, -1)
L[np.diag_indices_from(L)] = 1.0

我正在寻找矩阵 P ,使这行打印 True

print np.allclose(A, np.dot(P, np.dot(L, U)))

任何提示/链接/建议都表示赞赏!

1 个答案:

答案 0 :(得分:4)

需要按顺序解释置换向量。如果piv=[1,2,2]则需要按顺序完成以下操作(使用从零开始的索引):

  1. 第0行更改为第1行
  2. 新的第1行随第2行和
  3. 而变化
  4. 新的第2行保持不变。
  5. 在代码中,这可以解决问题:

    P = np.eye(3)
    for i, p in enumerate(piv):
        Q = np.eye(3,3)
        q = Q[i,:].copy()
        Q[i,:] = Q[p,:]
        Q[p,:] = q
        P = np.dot(P, Q)
    

    对于piv=[1,2,2] P

    [[ 0.  0.  1.]
     [ 1.  0.  0.]
     [ 0.  1.  0.]]
    

    这可能不是一种非常快速的计算 P 的方法,但它可以解决这个问题。