我正在尝试在Python中实现复数矩阵。但我被困在该计划的某个特定点。我有两个模块 Matrix.py,Complex.py 和一个测试程序test.py.模块实现在https://github.com/Soumya1234/Math_Repository/tree/dev_branch的Github中托管,我的 test.py 在下面给出
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(self,i,j)应该只改变第(i,j)位的值。那么为什么整个矩阵都会被取代?我做错了什么?
答案 0 :(得分:1)
如果您不想隐式制作init_value
的副本,您也可以将Matrix.addValue
更改为:
def addValue(self,i,j,value):
self.matrix_list[i][j] = value
这与Matrix目前的工作方式更为一致。重要的是要记住Complex
对象不能隐式地复制它自己,所以matrix_list
实际上有很多相同的对象(指向内存中一个对象的指针)所以如果你修改了对象-place,它会随处变化。
另一个提示 - 尝试有意义地使用__init__
Complex
。你可以改变这种事情:
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)
哪个更简洁,不使用临时初始化或变量,我发现更具可读性。向.copy()
添加某种Complex
方法也可能会让您受益,该方法会返回具有相同值的新Complex
对象。
关于字符串表示的方法 - 我建议将实数和虚数值显示为float
s,而不是整数,因为它们应该是实数。在这里,我将它们舍入到2位小数:
def __repr__(self):
return "%.2f+j%.2f" %(self.real,self.imag)
另请注意,如果它应与__str__
执行相同操作,则实际上不应该需要__repr__
。此外,show
似乎也大致相同。
此外,在Python中,没有私有变量,因此完全可以通过getReal
访问.real
而不是@property
。如果你真的需要getter / setter方法,请查看addValue
。
由于您已经在进行一些重载,我还建议在__getitem__
中实现def __setitem__(self, inds, value):
i, j = inds
self.matrix_list[i][j] = value
,我认为这非常适合Python数据模型下的索引设置。如果你这样做:
addValue
您可以将test.py
中的m1[1, 1] = C2
更改为:
docker pull hello-world
答案 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
。