Python 中的矩阵实现



我正在尝试在Python中实现一个复数矩阵。但是我被困在程序的特定点上。 我有两个模块Matrix.py,Complex.py和一个测试程序 test.py。模块实现托管在 Github 中 https://github.com/Soumya1234/Math_Repository/tree/dev_branch 下面给出了我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)位置的值。那为什么整个矩阵都要被替换呢?我做错了什么?

如果您不想隐式复制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)

哪个更简洁,不使用临时初始化或变量,我发现更具可读性。向Complex添加某种.copy()方法也可能对您有所帮助,该方法返回具有相同值的新Complex对象。

在您的字符串表示方法上 - 我建议将实值和虚值显示为floats,而不是整数,因为它们应该是实数。在这里,我将它们四舍五入到小数点后 2 位:

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

另请注意,如果它应该执行与__repr__相同的操作,您实际上不需要__str__。此外,show似乎也在做同样的事情。

此外,在 Python 中,没有私有变量,因此完全可以通过.real来访问它,而不是getReal。如果你真的需要吸气/二传手方法,看看@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

问题是,在矩阵初始化方法中,您将相同的值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

最新更新