0

我正在将一个 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 的作用。

4

2 回答 2

1
>>> 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不是您想要的。

于 2012-09-17T09:38:09.520 回答
0

一楼给你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,)所以你会得到答案。

于 2017-09-03T13:56:50.173 回答