我建议可能
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
答案 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)
。