我正在将Matlab函数转换为Python。不幸的是,我不是Matlab专家,我很难理解一些代码,比如下面这一行:
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
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做了什么。
发布于 2012-09-17 09:38:10
>>> 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
不是您想要的。
发布于 2017-09-03 13:56:50
第一层给出了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
在numpy形状中,(2L,).T
与(2L,)
相同,因此您将得到答案。
https://stackoverflow.com/questions/12454685
复制