Operazioni con matrici


Matrici quadrate


Considera le tre matrici

mA=[ [2,7], [1,0] ] 
mB=[ [1,2], [0,4] ] 
mC=[ [1,8], [0,5] ]

come argomenti delle funzioni

def copia(m):
   n=len(m) 
   mm=[] 
   for r in range(n): 
       riga=[] 
       for c in range(n): 
           riga.append(m[r]) 
       mm.append(riga) 
   return mm

Copia di una matrice quadrata

def creaZeri(n):
   mm=[]
   for r in range(n):
       riga=[] 
       for c in range(n):
           riga.append(0)
       mm.append(riga)   
   return mm

Crea una matrice

  • quadrata
  • piena di zeri
  • di dimensione n
def scalare(k,m):   
   n=len(m)
   mm=creaZeri(n,n)
   for r in range(n):
       for c in range(n):
           mm[r]=k*m[r] 
   return mm 

print(scalare(2, mA)) # [[4,14], [2,0]]
print(scalare(2, mB)) # [[2,4], [0,8]]
print(scalare(2, mC)) # [[2,16], [0,10]]
Prodotto per uno scalare
def somma(m1,m2):   
   n=len(m1) 
   mm=creaZeri(n)
   for r in range(n):
       for c in range(n):
           mm[r]=m1[r]+m2[r]
   return mm

print(somma(mA,mB)) # [[3, 9], [1, 4]]
print(somma(mA,mC)) # [[3, 15], [1, 5]]
print(somma(mB,mC)) # [[2, 10], [0, 9]]
Somma
def prodotto(m1,m2):   
   n=len(m1) 
   mm=creaZeri(n,n)
   for r in range(n):
       for c in range(n):
           somma=0  
           for k in range(n):
               somma+=m1[r][k]*m2[k]
           mm[r]=somma   
   return mm

print(prodotto(mA,mB)) # [[2, 32], [1, 2]]
print(prodotto(mA,mC)) # [[2, 51], [1, 8]]
print(prodotto(mB,mC)) # [[1, 18], [0, 20]]
Prodotto…
...

Matrici rettangolari


mA=[ [2,7], [1,0] ]
mB=[ [1,2], [0,4] ]
mC=[ [1,8,9], [0,5,9] ]

def creaZeri(nr,nc):
   mm=[]
   for r in range(nr):
      riga=[] 
      for c in range(nc):
         riga.append(0)
      mm.append(riga)   
   return mm

Crea una matrice

  • piena di zeri
  • di dimensione nr x nc
def scalare(k,m):   
   nr=len(m) 
   nc=len(m[0]) 

   mm=creaZeri(nr,nc)
   for r in range(nr):
      for c in range(nc):
         mm[r]=k*m[r] 
   return mm
Prodotto per uno scalare
def somma(m1,m2):   
   r1=len(m1)
   c1=len(m1[0])
   r2=len(m2)
   c2=len(m2[0])
   if(r1 != r2)or(c1 != c2): 
       return   

   mm=creaZeri(r1,c1)
   for r in range(r1):
       for c in range(c1):
           mm[r]=m1[r]+m2[r]
   return mm

print(somma(mA,mB)) # [[3, 9], [1, 4]]
print(somma(mA,mC)) # None
print(somma(mB,mC)) # None
Somma
def prodotto(m1,m2):   
   r1=len(m1)
   c1=len(m1[0])
   r2=len(m2)
   c2=len(m2[0])
   if(c1 != r2): 
      return

   mm=creaZeri(r1,c2)
   for r in range(r1):
       for c in range(c2):
           somma=0  
           for k in range(c1):
               somma+=m1[r][k]*m2[k]
           mm[r]=somma   
   return mm 

print(prodotto(mA,mB)) # [[2,32], [1,2]]
print(prodotto(mA,mC)) # [[2,51,81], [1,8,9]]
print(prodotto(mB,mC)) # [[1,18,27], [0,20,36]]
print(prodotto(mC,mA)) # None
Prodotto (se compatibili)

Determinante


def creaSotto(m, er,ec):      # Crea una sottomatrice di m (nxn) 
   mm=[]                      # Copia tutto tranne la riga er e la colonna ec
   n=len(m)

   for r in range(n):
       if(r != er): 
           riga=[]
           for c in range(n):
               if(c != ec):
                   riga.append(m[r])
           mm.append(riga)   
   return mm

def determinante(m):          # Calcola il determinante
   nr=len(m)                    
   nc=len(m[0])
   if(nr != nc):              # Se la matrice non è quadrata...
       return 0        
   if(nr == 1 ):              # Se è uno scalare...
       return m[0][0]

   somma=0
   segno=+1
   for r in range(nr):        # Sviluppa la 1° colonna...
       mm     = creaSotto(m, r,0) 
       somma += segno*m[r][0]*determinante(mm)
       segno *= -1
   return somma

Regola di Cramer


A=[ [2,7],                 # Matrice 2x2
    [1,0] ]
b=[ 2,                     # Vettore dei termini noti
    1 ]
#-------------------------------------------------
x=[]                       # Vettore soluzione, adesso è vuoto
dA=determinante(A)         # Determinante di A
n=len(A)

for c in range(n):
   Ac=copia(A)             # Determinante di A con b nella colonna c
   for r in range(n):      # ...
      Ac[r]=b[r]        # ...
   dAc=determinante(Ac)    # ...

   xc=dAc/dA               # Calcola xc come rapporto tra ...
   x.append(xc)            # Aggiunge xc al vettore soluzione x
#-------------------------------------------------
for i in range(0,n):       # Visualizza vettore soluzione
   print("x%i=%f" %(i+1,x[i]))

Matrici sghembe


def copia(m):
   nr=len(m) 
   mm=[] 
   for r in range(nr): 
      riga=[]
      nc=len(m[r])
      for c in range(nc):   # ogni riga può avere una lunghezza diversa
         riga.append(m[r]) 
      mm.append(riga) 
   return mm
#------------------------------
mA=[ [2,7],[1,0] ]        # 2x2   
mB=[ [12],[1,2],[0,4,5] ] # Triangolare...
mC=[ [1,8,5],[0,5,-1] ]   # 2x3
#------------------------------
print(mA); print(copia(mA))
print(mB); print(copia(mB))
print(mC); print(copia(mC))