在Python中对矩阵执行电源操作

时间:2017-02-06 11:43:26

标签: python matlab matrix

我有以下矩阵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'

1 个答案:

答案 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工作方式,这有利于在本机代码中计算矩阵运算。