我有以下矩阵 m。
m =
0 0 0 0
0 1 2 3
0 2 4 6
0 3 6 9
我正在尝试使用 Python 执行等效的 MATLAB 操作。
new_m = w.^m
即将 m 转换为以下矩阵:
new_m =
1 1 1 1
1 w^1 w^2 w^3
1 w^2 w^4 w^6
1 w^3 w^6 w^9
目前我的 Python 方法如下:
N=4
w=cmath.exp(2*pi) # Here w = 535.491655525+0j
row=list(range(N)) # In this case row = [0, 1, 2, 3]
#Create the matrix and perform operation on it
m = [[0]*N for i in range(N)]
for x in range(1,q):
for entry in row:
m[x][entry]=entry*r # <--- This gives me give me the above matrix m
# This was my attempt to perform the new_m=w.^m operation
for x in range(0,q):
for entry in row:
element=M[x][entry]
new_m[x][entry]=w**element # <--- This should give me the correct new_m matrix described above
我的 Python 代码给出了以下结果:
[ [ 1.0000e+00+0.j 1.0000e+00+0.j 1.0000e+00+0.j 1.0000e+00+0.j]
[ 1.0000e+00+0.j 5.3549e+02+0.j 2.8675e+05+0.j 1.5355e+08+0.j]
[ 1.0000e+00+0.j 2.8675e+05+0.j 8.2226e+10+0.j 2.3579e+16+0.j]
[ 1.0000e+00+0.j 1.5355e+08+0.j 2.3579e+16+0.j 3.6205e+24+0.j]]
但是,如果我在 MATLAB 中执行此操作,它会给出 new_m = w.^m
操作的答案:
new_m =
1.0e+24 *
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 3.6205
我不确定为什么这些答案不同,以及我认为我的 python 代码中存在错误的地方。 任何意见或建议将不胜感激!
注意: 我还尝试在第一组 for 循环之后使用以下命令(使用 m 矩阵):
new_m = w**m
但这产生了错误:
TypeError: unsupported operand type(s) for ** or pow(): 'complex' and 'list'
最佳答案
首先:您的 Python 代码和输出都是正确的 - 如果您检查输出,会发生什么情况:Matlab 仅显示矩阵的其他数字被四舍五入打印的值“0”,因为它对所有 Matrix 成员使用单个指数 (e+24)。
另一方面,Python 的输出可以正确打印每个数字及其本身的大小。因此, "2.3579e+16+0.j "是一个比 "3.6205e+24+0.j]"小 10**8 倍的数字,并且由于 Matlab 对所有内容都使用 e+24 指数,因此它只打印0. 不过,它在内部存储了正确的值。
第二:您应该使用 Numpy ( http://numpy.org ) - 除了其他几个功能之外,它确实提供了开箱即用的矩阵算术。
对于你的电源操作,例如: :
In [1]: import numpy as np
In [2]: z = np.array(range(9))
In [3]: z
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])
In [4]: z.shape = (3,3)
In [5]: z
Out[5]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [10]: w = cmath.exp(2*cmath.pi)
In [11]: w
Out[11]: (535.4916555247646+0j)
In [12]: w ** z
Out[12]:
array([[ 1.00000000e+00+0.j, 5.35491656e+02+0.j, 2.86751313e+05+0.j],
[ 1.53552935e+08+0.j, 8.22263156e+10+0.j, 4.40315059e+13+0.j],
[ 2.35785040e+16+0.j, 1.26260921e+19+0.j, 6.76116697e+21+0.j]])
(In[1]:
样式提示而不是 >>>
是由于 ipython
- 一种增强的 Python 交互式 shell,它是非常有用)
除此之外,使用外部 Python for 循环执行这种矩阵运算可能会慢 1000 到 10000 倍 - 因此,正确使用 Numpy 确实需要熟悉 Python,并熟悉 Numpy 的工作方式,这有利于在 native 代码中计算矩阵运算。
关于python - 在 Python 中对矩阵执行幂运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42066956/