MATLAB矩阵^ -0.5等效于Python

时间:2015-02-27 12:38:51

标签: python matlab matrix

我建议可能

 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

2 个答案:

答案 0 :(得分:2)

没有"矩阵" python中的类。从您的代码中可以看出您在谈论numpy

matlab用户可能遇到的问题是,numpy数组操作默认情况下元素,如果你想要矩阵运算,你需要请求它们:np.dot for矩阵乘法,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]])

答案 1 :(得分:1)

看起来像使用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)