2017-09-04 3 views
0

J'essaie d'implémenter une matrice de nombres complexes en Python. Mais je suis coincé à un moment donné dans le programme. J'ai deux modules Matrix.py, Complex.py et un programme de test test.py. La mise en œuvre du module est hébergé dans Github à https://github.com/Soumya1234/Math_Repository/tree/dev_branch et mon test.py est donnée ci-dessousImplémentation de la matrice en 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() 

Comme mentionné dans le commentaire, le addValue (auto, i, j) Matrix.py est censé changer la valeur à la (i, j) position seulement. Alors pourquoi la matrice entière est-elle remplacée? Qu'est ce que je fais mal?

+1

S'il vous plaît ne font pas référence au code externe dans les questions (il se les fermé), poster plutôt un travail minimum exemple ici. –

Répondre

0

Le problème est que, dans votre méthode d'initialisation de matrice, vous ajoutez la même valeur C_init à toutes les entrées de votre matrice. Comme vous ne définissez pas simplement sa valeur dans chacune des entrées, mais l'élément lui-même, vous obtenez un énorme problème après: comme l'objet stocké dans (0,0) est le même objet que dans toutes les autres entrées, vous changez toutes les entrées quand vous voulez juste changer une entrée.

Vous devez modifier votre méthode d'initialisation comme ceci:

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)] 

De cette façon, vous ajoutez des entrées de la même valeur à votre matrice, mais son pas à chaque fois une référence au même objet. En outre: juste pour la pratique c'est un bon exemple, mais si vous voulez utiliser la classe Matrix pour calculer quelque chose, vous devriez plutôt utiliser numpy arrays.

+0

Merci beaucoup –

1

Si vous ne voulez pas faire implicitement des copies de init_value vous pouvez également changer Matrix.addValue à ceci:

def addValue(self,i,j,value): 
    self.matrix_list[i][j] = value 

Ceci est un peu plus conforme à la façon dont votre matrice fonctionne actuellement. Il est important de se rappeler qu'un objet Complex ne peut pas implicitement faire une copie de lui-même, donc matrix_list a effectivement beaucoup d'objets identiques (pointeurs vers un objet en mémoire) donc si vous modifiez l'objet en place, il changera partout.

Un autre conseil - essayez d'utiliser le __init__ de Complex de manière significative. Vous pouvez changer ce genre de chose:

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 

à ceci:

def __sub__(self, other): 
    return Complex(self.real - other.real, 
        self.imag - other.imag) 

Ce qui est plus concis, ne pas utiliser initialisations temporaires ou variables, et je trouve plus facile à lire. Il peut également vous être utile d'ajouter une sorte de méthode .copy() à Complex, ce qui renvoie un nouvel objet Complex avec les mêmes valeurs.

Sur vos méthodes pour la représentation sous forme de chaîne - Je recommanderais d'afficher les valeurs réelles et imaginaires sous la forme float s, et non des entiers, car ils doivent être des nombres réels. Ici, je les ai arrondi à 2 décimales:

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

Notez également que vous devriez vraiment pas besoin __str__ si elle doit faire la même chose que __repr__. En outre, show semble faire à peu près la même chose, encore une fois.

En outre, en Python, il n'y a pas de variables privées, donc au lieu de getReal il est tout à fait possible de simplement y accéder par .real. Si vous avez vraiment besoin de méthodes getter/setter, regardez @property. Comme vous êtes déjà en train de faire une surcharge, je vous recommande également d'implémenter addValue dans __getitem__, ce qui me semble être un bon ajustement d'index sous le modèle de données de Python. Si vous faites ceci:

def __setitem__(self, inds, value): 
    i, j = inds 
    self.matrix_list[i][j] = value 

Vous pouvez changer le addValue en test.py à ceci:

m1[1, 1] = C2 
+0

Merci beaucoup –