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]])
我建议可以
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]])