2010-06-24 71 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