将一行Matlab(bsxfun,rdivide)转换为Python

将一行Matlab(bsxfun,rdivide)转换为Python,python,matlab,numpy,bsxfun,Python,Matlab,Numpy,Bsxfun,我正在将一个Matlab函数翻译成Python。不幸的是,我不是一个Matlab专家,我很难理解一些行,例如。G这个: a = [[0, 1]; [2, 3]] bsxfun(@rdivide, sqrt(a), a) 我还没有真正理解它,但我认为这句话是可以理解的 r / a 对于sqrt(a)的每一行r(或者是每一列?)和r/sqrt(a)通常可以转换为numpy,如下所示 numpy.linalg.solve(sqrt(a).T, r.T).T 问题是:Matlab说结果是

我正在将一个Matlab函数翻译成Python。不幸的是,我不是一个Matlab专家,我很难理解一些行,例如。G这个:

a = [[0, 1]; [2, 3]]
bsxfun(@rdivide, sqrt(a), a)
我还没有真正理解它,但我认为这句话是可以理解的

r / a
对于sqrt(a)的每一行r(或者是每一列?)和r/sqrt(a)通常可以转换为numpy,如下所示

numpy.linalg.solve(sqrt(a).T, r.T).T
问题是:Matlab说结果是

       NaN   1.00000
   0.70711   0.57735
努比说是的

[ 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的作用

>>> 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()
求解线性矩阵方程或线性标量方程组

因此,范围(2)中i的代码
: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

在numpy形状中,
(2L,).T
(2L,)
相同,因此您将得到答案。

matlab代码完全等效于
sqrt(a)。/a
,即它将
sqrt(a)
的每个元素除以
a
的相应元素(它也等效于
1./sqrt(a)
)。好,因此,Matlab函数的作者也不是Matlab专家:如果第二个矩阵是向量,e。G[1, 2]? BSX调整矩阵的大小,同时节省计算时间和内存。Matlab中的
/
运算符是右矩阵除法,即
A/B
相当于
A*inv(B)
。如果需要按元素划分,则需要
A./B