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

2024-10-01 13:43:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我还不太明白,但我想这句台词能理解

^{pr2}$

对于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的作用。在


Tags: 函数innumpyfor矩阵sqrtnan专家
2条回答

第一层是python代码的转换。在

但如果你想知道为什么要写代码:

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

给出结果

^{pr2}$

因为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和{}相同,所以你会得到答案。在

>>> 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]])
>>>

因为你需要一个element-wise division,而不是矩阵的逆相乘,numpy.linalg不是你想要的。在

相关问题 更多 >