Advertisement
paulogp

Matriz

Aug 7th, 2011
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.41 KB | None | 0 0
  1. class Matrix:
  2.      __doc__= """Uma classe de matrizes em Python. Criar uma variável 'matrix' por:
  3. A=Matrix( lista de linhas )
  4. Por exemplo A=Matrix([[1,0],[0,1]]) criará uma matriz cujas linhas são [1,0] e [0,1], i.e. a
  5. matriz da unidade 2x2.
  6. Atributos de uma variável da classe Matrix:
  7.     matrix : contém a matriz em forma de listas de linhas
  8.     rows: número de linhas da matriz
  9.     cols: número de colunas da matriz
  10. No exemplo: A.matrix tem valor [[1,0],[0,1]]; A.rows e A.cols têm ambas o valor 2"""
  11.  
  12.      def __GetDimensions__(self,M):
  13.           rows=len(M)
  14.           cols=len(M[0])
  15.           # Temos de verificar que todas as linhas têm o mesmo número de colunas
  16.           invalid=([len(x) for x in M].count(cols)!=rows)
  17.           return (invalid,rows,cols)
  18.      
  19.      def __init__(self, M):
  20.           dimensoes=self.__GetDimensions__(M)
  21.           if dimensoes[0]==True:
  22.                print "Matriz nao valida"
  23.           else:
  24.                self.matrix=M
  25.                self.rows=dimensoes[1]
  26.                self.cols=dimensoes[2]
  27.  
  28.      def AddLine(self,i,j):
  29.           """AddLine(i,j) soma a linha j à linha i (módulo 2)"""              
  30.           self.matrix[i]=[ (self.matrix[i][k]+self.matrix[j][k])%2 for k in range(0,self.cols)]
  31.  
  32.      def ExchangeLine(self,i,j):
  33.           """ExchangeColumn(i,j) trocar as linhas i e j"""
  34.           L=self.matrix[i]
  35.           self.matrix[i]=self.matrix[j]
  36.           self.matrix[j]=L
  37.  
  38.      def ExchangeColumn(self,u,v):
  39.           """ExchangeColumn(u,v) trocar as colunas u e v"""
  40.           for k in range(0,self.rows):
  41.                h=self.matrix[k][u]
  42.                self.matrix[k][u]=self.matrix[k][v]
  43.                self.matrix[k][v]=h
  44.  
  45.      def __GetPivotElement__(self,i):
  46.           for l in range(i,self.cols):
  47.                for k in range(i,self.rows):
  48.                     if self.matrix[k][l]!=0:
  49.                          return (k,l)
  50.           return (self.rows,self.cols)
  51.  
  52.      def GetRow(self,n):
  53.           """GetRow(n) devolve a n-esima linha da matriz (na forma de um vector=lista)"""
  54.           return self.matrix[n]
  55.  
  56.      def GetColumn(self,n):
  57.           """GetColum(n) devolve a n-esima coluna da matriz (na forma de um vector=lista)"""
  58.           return [self.matrix[k][n] for k in range(0,self.rows)]
  59.  
  60.      def GetColumns(self,lista):
  61.           """GetColumns(L) devolve a matriz das colunas indexadas pela lista L.
  62.          Por exemplo A.GetColumns([1,3,5]) devolve a matriz formada pelas colunas 1,3 e 5 da matriz A"""
  63.           return Matrix([self.GetColumn(i) for i in lista])
  64.  
  65.      def Transpose(self):
  66.           """Transpose(): devolve a matriz transposta da matriz"""
  67.           return Matrix([self.GetColumn(i) for i in range(0,self.cols)])
  68.      
  69.      def Rank(self):
  70.           """Rank() calcula a caracteristica da matriz visto como matriz binária."""
  71.           import copy
  72.           cpy=copy.deepcopy(self.matrix)
  73.           n=min(self.rows,self.cols)
  74.           for i in range(0,n):
  75.                p=self.__GetPivotElement__(i)
  76.                if p!=(self.rows,self.cols):
  77.                     self.ExchangeLine(i,p[0])
  78.                     self.ExchangeColumn(i,p[1])
  79.                     for k in range(i+1,self.rows):
  80.                          if self.matrix[k][i]!=0: self.AddLine(k,i)
  81.                else: i=n
  82.           rg=sum([self.matrix[i][i] for i in range(0,n)])
  83.           self.matrix=cpy
  84.           return rg
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement