Python中的矩阵实现
我试图在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)位置处的值。那么为什么整个矩阵被替换?我做错了什么?
问题是,在您的矩阵初始化方法中,您将相同的值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
。
非常感谢你 –
如果你不想让含蓄的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
非常感谢 –
请不要引用外部代码的问题(这将让他们关闭),而不是发布最低工作例如这里。 –