2017-01-31 30 views
2

我想求解線性方程Ax = b,每個A包含3d矩陣。對於-例如,Numpy求解無迴路的3d線性方程

在AX = B, 假設A.shape是(2,3,3)

即= [[[1,2,3],[1,2,3], [1,2,3]] [[1,2,3],[1,2,3],[1,2,3]]]

and B.shape is(3,1) ie [1,2,3]^T

我想知道Ax = B ie(x_1,x_2,x_3)的每個3矢量x

什麼想到的是乘法乙與np.ones(2,3)和使用功能點與每個A元素的逆。但是它需要循環才能做到這一點(當矩陣大小增加時會消耗大量時間)(例A [:] [:] = [1,2,3]) 如何解決許多Ax = B方程沒有循環?

  • 我所做的A和B的元素是相同的,但正如您可能知道的那樣,它僅僅是一個例子。

回答

1

對於可逆矩陣,我們可以在3D陣列A上使用np.linalg.inv然後用張量矩陣乘法與B使我們分別失去這些兩個陣列的最後一個和第一軸,像這樣 -

np.tensordot(np.linalg.inv(A), B, axes=((-1),(0))) 

樣品運行 -

In [150]: A 
Out[150]: 
array([[[ 0.70454189, 0.17544101, 0.24642533], 
     [ 0.66660371, 0.54608536, 0.37250876], 
     [ 0.18187631, 0.91397945, 0.55685133]], 

     [[ 0.81022308, 0.07672197, 0.7427768 ], 
     [ 0.08990586, 0.93887203, 0.01665071], 
     [ 0.55230314, 0.54835133, 0.30756205]]]) 

In [151]: B = np.array([[1],[2],[3]]) 

In [152]: np.linalg.solve(A[0], B) 
Out[152]: 
array([[ 0.23594665], 
     [ 2.07332454], 
     [ 1.90735086]]) 

In [153]: np.linalg.solve(A[1], B) 
Out[153]: 
array([[ 8.43831557], 
     [ 1.46421396], 
     [-8.00947932]]) 

In [154]: np.tensordot(np.linalg.inv(A), B, axes=((-1),(0))) 
Out[154]: 
array([[[ 0.23594665], 
     [ 2.07332454], 
     [ 1.90735086]], 

     [[ 8.43831557], 
     [ 1.46421396], 
     [-8.00947932]]]) 

可替換地,張量矩陣乘法可以通過來代替,像這樣 -

np.matmul(np.linalg.inv(A), B) 

Python的3.x中,我們可以使用@ operator對於相同的功能 -

np.linalg.inv(A) @ B 
+0

如果四維矩陣,會發生什麼?這有相同的程序嗎? –

+0

@구마왕是的,無需更改。 – Divakar

+0

張量點中的負值「-1」是多少?我猜它應該是'1' –