2017-01-31 6 views
2

Я хочу решить линейное уравнение Ax = b, каждое A содержит в 3d-матрице. Для-например,Решающее решение 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]]]

и B.shape is (3,1) т.е. [1,2,3]^T

И я хочу знать каждый 3-векторный x Ax = B ie (x_1, x_2, x_3).

Что приходит в голову, умножьте B на np.ones (2,3) и используйте функцию dot с инверсией каждого элемента A. Но для этого требуется цикл. (Который потребляет много времени, когда размер матрицы растет вверх) (Пример A [:] [:] = [1,2,3]) Как я могу решить многие уравнения Ax = B без цикла?

  • Я сделал элементы A и B такими же, но, как вы, вероятно, знаете, это просто пример.

ответ

1

Для обратимых матриц, мы могли бы использовать np.linalg.inv на 3D массиве A, а затем использовать тензор матричного умножения с 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.matmul(np.linalg.inv(A), B) 

На Python 3.x, мы могли бы использовать для @ operator ту же функциональность -

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

Что произойдет, если 4d матрицы? Имеет ли такая процедура? –

+0

@ 구 마왕 Да, никаких изменений не требуется. – Divakar

+0

Что такое отрицательное значение «-1» в тензорной точке? Я предполагаю, что это должно быть «1» –

Смежные вопросы