2010-06-24 29 views
1

例如索引問題,有一種矩陣:的ndarray

import numpy as np 
A = np.array([[ 8. , -6. , 2. ], 
       [-0.5, 8. , -6. ], 
       [ 0.5, -0.5, 2. ]]) 

這是一個LU分解(杜利特爾的分解)結果(A = [L \ C])
我想獲得L和ü從A
ü應該是:

U = np.array([[ 8., -6., 2.], 
       [ 0., 8., -6.], 
       [ 0., 0., 2.]]) 

L應:

L = np.array([[ 1. , 0. , 0. ], 
       [-0.5, 1. , 0. ], 
       [ 0.5, -0.5, 1.]]) 

那麼,我想知道的是如何從A獲得L和U?

回答

2

您不需要任何索引操作。只要使用triltriuidentity功能:

import numpy as np 
A = np.array([[ 8. , -6. , 2. ], 
       [-0.5, 8. , -6. ], 
       [ 0.5, -0.5, 2. ]]) 

U = np.triu(A) 

#[[ 8. -6. 2.] 
# [-0. 8. -6.] 
# [ 0. -0. 2.]] 

L = np.tril(A, k=-1) + np.identity(3) 

#[[ 1. 0. 0. ] 
# [-0.5 1. 0. ] 
# [ 0.5 -0.5 1. ]] 
+0

工程就像一個魅力,謝謝。 – sunqiang 2010-06-24 08:27:09

1

你想看起來並不像LU分解給我, http://en.wikipedia.org/wiki/LU_decomposition

>>> U_ = np.array([[ 8., -6., 2.], 
       [ 0., 8., -6.], 
       [ 0., 0., 2.]]) 
>>> L_ = np.array([[ 1. , 0. , 0. ], 
       [-0.5, 1. , 0. ], 
       [ 0.5, -0.5, 1.]]) 
>>> np.dot(L_, U_) 
array([[ 8., -6., 2.], 
     [ -4., 11., -7.], 
     [ 4., -7., 6.]]) 

LU分解什麼是scipy.linalg提供

>>> A = np.array([[ 8. , -6. , 2. ], [-0.5, 8. , -6. ], [ 0.5, -0.5, 2. ]]) 
>>> import scipy.linalg as spla 
>>> P, L, U = spla.lu(A) 
>>> L 
array([[ 1.  , 0.  , 0.  ], 
     [-0.0625 , 1.  , 0.  ], 
     [ 0.0625 , -0.01639344, 1.  ]]) 
>>> U 
array([[ 8.  , -6.  , 2.  ], 
     [ 0.  , 7.625  , -5.875  ], 
     [ 0.  , 0.  , 1.77868852]]) 
>>> np.dot(L, U) 
array([[ 8. , -6. , 2. ], 
     [-0.5, 8. , -6. ], 
     [ 0.5, -0.5, 2. ]]) 
+0

@ user333700,感謝您的非常清楚的演講。對不起我的英文破碎。事實上,A已經是LU分解(Doolittle分解)的結果,我從另一個LU分解函數(而不是scipy.linalg.lu)獲得A作爲返回值。它將L和U保存爲[L \ U](aka,A)形式。 np.dpt(L,U)將輸出原始矩陣(與您的np.dot(L_,U_)相同)。 – sunqiang 2010-06-30 00:48:16

+0

我想我沒有仔細閱讀它是LU結果的部分。對不起 – user333700 2010-06-30 07:24:11

+0

@ user333700,很高興認識你,並感謝你的幫助。 :) – sunqiang 2010-06-30 08:24:26