2017-09-04 82 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

非常感谢 –