2017-02-06 3 views
1

私は以下の行列を持っています。Pythonで行列のパワー演算を行う

m = 

0  0  0  0 
0  1  2  3 
0  2  4  6 
0  3  6  9 

私は、Pythonを使用して同等のMATLAB操作を実行しようとしています。

new_m = w.^m 

すなわちfollwing行列にメートルを変換:

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のアプローチは以下の通りです:

[ [ 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]] 

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コードは私に次のような結果になります

しかし、私はF私はそれが私にnew_m = w.^m操作のため、この答えを与えるMATLABでこの操作を実行します。

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コードに誤りであることを想定しています何でウォンをつもりですなぜ私はわかりませんよ。 アドバイスやご提案をいただければ幸いです!

new_m = w**m 

しかし、それはエラー生成:

TypeError: unsupported operand type(s) for ** or pow(): 'complex' and 'list' 
+0

まず、Pythonでatrixの作業をしている場合は、langaugeの仕組みを理解するだけで、Numpyを使用してください。http://www.numpy.org/ - この種の操作のサポートは、 Numpy Arraysを使用したボックスで、外部のPython forループで実行された操作と同じ操作より約10000倍も速くなります。 – jsbueno

答えて

3

をIはまた、(M行列を使用して)ループのための私の第一のセットの後に次のコマンドを使用して試みた 最初に:あなたのPythonコードと出力はどちらも正しいです。出力をチェックすると、Matlabは行列の他の数字が "0"に丸められた値を表示しますすべてのMatrixメンバーに対して単一の指数(e + 24)。

一方、Pythonの出力では、各数値が固有の大きさで正しく出力されます。したがって、 "2.3579e + 16 + 0.j"は "3.6205e + 24 + 0.j"より小さい10 ** 8倍の数であり、Matlabはすべてにe + 24指数を使用しているので、しかし、内部的に正しい値が格納されます。

第2の: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のインタラクティブシェル)そのほかに

、この種の実行o外部のPython forループを使った行列操作は、1000〜10000倍遅くなる可能性があります.Numpyを適切に使用するには、Pythonに精通していて、Numpyの作業方法に精通していますnsはネイティブコードで計算されます。

+0

私は非常に混乱していたとして説明していただきありがとうございます! numpyのことを聞いたことがありますが、numpyを使って特定の行列m形式を正しく実現するのに苦労していたので、代わりにpythonループを使用しました。それにもかかわらず、私は再び見て、説明してくれてありがとう! – Catherine

+0

行列 'm'の初期値を埋めるためのコードは正しいので、作成されたnumpy行列の後に必要となることに注意してください。 – jsbueno

+0

ありがとうございました。mとnew_mを 'm = np.zeros((N、N))'と 'new_m = np.zeros((N、N))'に変更しました。しかし、 'new_m [x] [entry] = w ** element'の行に関して、 'TypeError:complexをfloatに変換できません 'というエラーが出ます。私は元の質問でそれを持っていたのではなく、なぜこれがnpを使って起こっているのか考えていますか? – Catherine

関連する問題