2017-09-04 8 views
0

Pythonで行列の複素数を実装しようとしています。しかし、私はプログラムの特定の時点で立ち往生しています。私は2つのモジュールMatrix.py、Complex.pyと1つのテストプログラムtest.pyを持っています。モジュールの実装がhttps://github.com/Soumya1234/Math_Repository/tree/dev_branchでのGithubでホストされているとのコメントで述べたように、私のtest.pyPythonでの行列の実装

from Matrix import * 
from Complex import * 

C_init = Complex(2, 0) 
print C_init 
m1 = Matrix(2, 2, C_init) 
m1.print_matrix() 
C2= Complex(3, 3) 
m1.addValue(1, 1, C2)//This is where all values of the matrix are getting 
         changed. But I want only the (1,1)th value to be changed to C2 
m1.print_matrix() 

の下に与えられ、Matrix.pyでaddValue(自己、I、J)が変更になっています(i、j)番目の位置のみの値。それではなぜ行列全体が置き換えられるのでしょうか?私が間違っていることは何ですか?

+1

を最小限に抑え、作業を投稿する代わりに、(それは彼らが閉鎖されます)質問に外部コードを参照しないでくださいここの例。 –

答えて

0

問題は、マトリックスの初期化メソッドで、同じ値のC_initをマトリックスのすべてのエントリに追加することです。各エントリではなくアイテム自体の値を設定するだけでなく、後で大きな問題が発生します。(0,0)に格納されているアイテムは他のすべてのエントリと同じオブジェクトなので、すべてのエントリをまとめて変更します1つのエントリを変更したいときに使用します。

あなたはこのようなあなたの初期化方法を変更する必要があります:あなたは毎回同じオブジェクトへの参照を、あなたの行列に同じ値のエントリを追加しますが、そのない。このように

def __init__(self,x,y,init_value): 
    self.row=x 
    self.column=y 
    self.matrix_list=[[Complex(init_value.getReal(), init_value.getComplex()) for i in range(y)] for j in range(x)] 

さらに、これを実行するのが良い例ですが、Matrixクラスを使用して何かを計算したい場合は、numpy arraysを使用してください。

+0

ありがとうございました –

1

あなたが暗黙的にinit_valueのコピーを作成したくない場合、あなたはまた、これにMatrix.addValueを変えることができる:

def addValue(self,i,j,value): 
    self.matrix_list[i][j] = value 

これはあなたの行列が現在どのように機能するかに沿って、もう少しです。 Complexオブジェクトは暗黙的に自身のコピーを作成できないので、matrix_listは実際には同じオブジェクト(メモリ内の1つのオブジェクトへのポインタ)をたくさん持っているので、オブジェクトをインプレースで変更すると、どこでも変更されます。

もう1つのヒント - __init__の意味はComplexです。 、

def __sub__(self, other): 
    return Complex(self.real - other.real, 
        self.imag - other.imag) 

より簡潔で、一時initialisationsや変数を使用していない、と私はより読みやすい見つける:これに

def __sub__(self,complex_object): 
    difference=Complex(0,0) 
    difference.real=self.real-complex_object.real 
    difference.imag=self.imag-complex_object.imag  
    return difference 

:あなたはこの種のものを変更することができます。 Complexに何らかの種類の.copy()メソッドを追加すると、同じ値を持つ新しいComplexオブジェクトが返される場合もあります。

文字列表現の方法では、実数でなければならないので、実数と虚数の値をfloatとして表示することをお勧めします。それは__repr__と同じことを行う必要がある場合は、あなたが実際に__str__を必要としてはならないことも

def __repr__(self): 
    return "%.2f+j%.2f" %(self.real,self.imag) 

注:ここで私は、小数点以下2桁にそれらを丸めました。また、showはおおよそ同じようになっているようです。

また、Pythonではプライベート変数がありませんので、getRealの代わりに.realでアクセスすることができます。 getter/setterメソッドが本当に必要な場合は、@propertyを参照してください。

すでにオーバーロードしているので、addValue__getitem__に実装することをお勧めします。これは、Pythonのデータモデルでのインデックス設定に適していると思います。あなたがこれを行う場合:

def __setitem__(self, inds, value): 
    i, j = inds 
    self.matrix_list[i][j] = value 

をあなたはこれにtest.pyaddValueを変更することができます:

m1[1, 1] = C2 
+0

ありがとう –