Перевод строки Matlab (bsxfun, rdivide) в Python

Я перевожу функцию Matlab на Python. К сожалению, я не эксперт по Matlab, и мне трудно понять некоторые строки, например, такую:

a = [[0, 1]; [2, 3]]
bsxfun(@rdivide, sqrt(a), a)

Я еще не совсем понял, но я думаю, что эта строка

r / a

для каждой строки r в sqrt(a) (или в каждом столбце?) и r / sqrt(a) обычно можно перевести в numpy как

numpy.linalg.solve(sqrt(a).T, r.T).T

Проблема в следующем: Матлаб говорит, что результат

       NaN   1.00000
   0.70711   0.57735

и NumPy говорит, что это

[ 1.  0.]
[ 0.55051026  1.41421356]

который был создан

for i in range(2): print linalg.solve(sqrt(a).T, a[i, :].T).T

Где ошибка? Матрицы sqrt (a) и a являются просто примерами. Вы можете заменить их любой другой матрицей. Я просто пытаюсь понять, что bsxfun делает с rdivide.

2 ответа

Решение
>>> import numpy as np
>>> a = np.array([[0,1],[2,3]])
>>> a
array([[0, 1],
       [2, 3]])
>>> b = np.sqrt(a)
>>> b/a
Warning: invalid value encountered in divide
array([[        nan,  1.        ],
       [ 0.70710678,  0.57735027]])
>>>

Так как вам нужно поэлементное деление, а не умножение матриц на обратное, numpy.linalg это не то, что вы хотите.

Первый этаж дает вам преобразование кода Python.

но если вы хотите знать, почему код:

for i in range(2): print linalg.solve(sqrt(a).T, a[i, :].T).T

дать результат

[ 1.  0.]
[ 0.55051026  1.41421356]

так как linalg.solve() Решите линейное матричное уравнение или систему линейных скалярных уравнений.

так что код for i in range(2): print linalg.solve(sqrt(a).T, a[i, :].T).Tбудет решать линейные матричные уравнения

0 * x0 + sqrt(2) * x1 = 0
1 * x0 + sqrt(3) * x1 = 1
0 * x0 + sqrt(2) * x1 = 2
1 * x0 + sqrt(3) * x1 = 3

так что вы получите результат

[ 1, 0].T
[ 3 - sqrt(6) , sqrt(2)].T

и в форме пупка (2L,).T такой же как (2L,) так что вы получите ответ.

Другие вопросы по тегам