我有以下矩阵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'
答案 0 :(得分:3)
首先:你的Python代码和输出都是正确的 - 如果检查输出,那么Matlab只会显示其中矩阵的其他数字打印为舍入到的值“0”,因为它对所有Matrix成员使用单个指数(e + 24)。
另一方面,Python的输出正确地打印每个具有其原生幅度的数字。因此,“2.3579e + 16 + 0.j”是比“3.6205e + 24 + 0.j]”小10 ** 8倍的数字,并且由于Matlab正在使用e + 24指数,所以它只是打印在内部,它存储了正确的值。第二次:你应该使用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)
除此之外,执行此类o使用外部Python for循环的Matrix操作可能慢1000到10000倍 - 因此,正确使用Numpy确实涉及熟悉Python,熟悉Numpy工作方式,这有利于在本机代码中计算矩阵运算。