MATLAB 矩阵^-0.5 等价于 Python

MATLAB matrix^-0.5 equivalent in Python

我建议可以

 np.linalg.inv(np.sqrt(matrix))

但是将结果与 MATLAB 进行比较后,我发现了很大的不同:

这是在 MATLAB 中

 0.2622   -0.0828   -0.0708
-0.0828    0.2601   -0.0792
-0.0708   -0.0792    0.2664

这是在 Python:

 0.8607   -0.4417   -0.3536
-0.4417    0.8967   -0.4158
-0.3536   -0.4158    0.8525

输入是

34.502193  27.039107  24.735074
27.039107  36.535737  26.069613
24.735074  26.069613  32.798584

您似乎使用 Python 计算了矩阵平方根的倒数(听起来很奇怪抱歉),而不是将矩阵乘以 -0.5 次方。

例如,运行 使用 Matlab 的这个命令我用 python:

得到你的输出
m = [34.502193  27.039107  24.735074
27.039107  36.535737  26.069613
24.735074  26.069613  32.798584]


A = inv(sqrt(m))

A =

    0.8608   -0.4417   -0.3537
   -0.4417    0.8967   -0.4159
   -0.3537   -0.4159    0.8525

与此相对:

B = m^(-.5)

B =

    0.2622   -0.0828   -0.0708
   -0.0828    0.2601   -0.0792
   -0.0708   -0.0792    0.2664

正确的Python代码请看@ev-br的回答

注意矩阵平方根这样的东西,对于矩阵 M 定义为:

A*A = M

并且完全不对应于矩阵M中每个元素单独取的平方根。矩阵平方根在 Matlab 中使用 sqrtm 函数获得,等效于 m^(.5).

python中没有"matrix"class。从您的代码看来,您正在谈论 numpy

matlab 用户可能遇到的问题是,在 numpy 中,数组运算默认为 elementwise,如果您需要矩阵运算,则需要请求它们:np.dot 用于矩阵乘法,np.linalg.inv 用于求逆等

np.linalg.inv(np.sqrt(a))首先对a的每个元素取平方根,然后将结果在线性代数意义上取反。我怀疑这不是你的意思。

如果你的意思是按元素操作,即你想提高每个元素的幂-1/2,那么就像@Benoit_11建议的那样,使用 1 / np.sqrt(a).

如果你要的其实是线性代数运算,那就用scipy.linalg.sqrtm

In [14]: a
Out[14]: 
array([[ 34.502193,  27.039107,  24.735074],
       [ 27.039107,  36.535737,  26.069613],
       [ 24.735074,  26.069613,  32.798584]])
In [15]: from scipy.linalg import sqrtm

In [16]: sq = sqrtm(a)

In [17]: np.dot(sq, sq) - a
Out[17]: 
array([[  4.97379915e-14,   4.97379915e-14,   2.84217094e-14],
       [  5.32907052e-14,   6.39488462e-14,   4.61852778e-14],
       [  3.55271368e-14,   3.19744231e-14,   3.55271368e-14]])