Python中的矩阵实现

时间:2017-09-04 12:21:44

标签: python matrix complex-numbers

我正在尝试在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)位的值。那么为什么整个矩阵都会被取代?我做错了什么?

2 个答案:

答案 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