2017-09-04 109 views
0

我試圖在Python中實現複數的矩陣。但是我被困在程序的某個特定點上。我有兩個模塊Matrix.py,Complex.py和一個測試程序test.py.該模塊實現在Github上在https://github.com/Soumya1234/Math_Repository/tree/dev_branch主辦,我test.py下面Python中的矩陣實現

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)中的項目與所有其他條目中的項目相同,因此您將所有條目一起更改當你只是想改變一個條目。

您必須修改初始化方法是這樣的:

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實際上有很多相同的對象(指向內存中的一個對象的指針),所以如果您就地修改該對象,它將在任何地方都會改變。

另一個提示 - 嘗試使用Complex有意義的__init__。你可以改變這樣的事情:

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 

要這樣:

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

哪個更簡潔,不使用臨時initialisations或變量,我覺得更易讀。對Complex添加某種.copy()方法也許會有好處,它會返回一個具有相同值的新對象Complex

在你的字符串表示方法 - 我建議顯示的實數和虛數值爲float s,而不是整數,因爲它們應該是實數。在這裏,我他們四捨五入至小數點後2位:

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

還請注意,你其實不應該需要__str__是否應該做同樣的事情爲__repr__。另外,show似乎也大致相同。

此外,在Python中,沒有私有變量,因此,而不是getReal完全可以通過.real訪問它。如果您確實需要getter/setter方法,請查看@property

由於您已經在做一些重載,我還建議在__getitem__中實現addValue,我認爲這很適合Python數據模型下的索引設置。如果你這樣做:

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

你可以在test.py改變addValue這樣:

m1[1, 1] = C2 
+0

非常感謝 –