Matrici rettangolari

Se le matrici possono avere dimensioni qualsiasi allora ogni funzione inizia con il controllo di compatibilità e poi esegue l’operazione richiesta.


Considera le tre matrici seguenti come parametri attuali nelle chiamate delle funzioni

A = [ [2, 7], [1, 0] ]
B = [ [1, 2], [0, 4] ]
C = [ [1, 8, 9], [0, 5, 9] ]

Prodotto per uno scalare

def scalare(k, m1):   
    nr=len(m1) 
    nc=len(m1[0]) 
    m2=[]
    for r in range(nr):
        riga=[]
        for c in range(nc):            
            riga.append(k*m1[r][c])
        m2.append(riga)
    return m2

print(scalare(2, A))  # [ [4, 14], [2, 0] ]
print(scalare(2, B))  # [ [2, 4], [0, 8] ]
print(scalare(2, C))  # [ [2, 16, 18], [0, 10, 18] ]

Somma

def somma(m1, m2): 
    nr1=len(m1) 
    nc1=len(m1[0]) 
    nr2=len(m2) 
    nc2=len(m2[0]) 
    if(nr1 != nr2) or (nc1 != nc2): 
        return None

    m3=[]
    for r in range(nr1): 
        riga=[]
        for c in range(nc1): 
            riga.append(m1[r][c]+m2[r][c])
        m3.append(riga)
    return m3 

print(somma(matA, matB))  # [ [3, 9], [1, 4] ]
print(somma(matA, matC))  # None 
print(somma(matB, matC))  # None

Prodotto

def prodotto(m1, m2): 
    nr1=len(m1) 
    nc1=len(m1[0]) 
    nr2=len(m2) 
    nc2=len(m2[0]) 
    if(nc1 != nr2):
        return None

    m3=[]
    for r in range(nr1):
        riga=[]
        for c in range(nc1):
            x=0
            for k in range(nc1): 
                x += m1[r][k]*m2[k][c]
            riga.append(x) 
        m3.append(riga)
    return m3


print(prodotto(A, B))  # [ [2, 32] , [1, 2] ] 
print(prodotto(A, C))  # [ [2, 51, 81], [1, 8, 9] ] 
print(prodotto(B, C))  # [ [1, 18, 27], [0, 20, 36] ] 
print(prodotto(C, A))  # None

Se il secondo argomento è un vettore colonna (una matrice n x 1…) scrivilo come vettore di vettori: [ [1], [2], [3] ]



Matrice nulla

Crea una matrice piena di zeri di dimensione nr x nc

def nulla(nr, nc):
    m=[]
    for r in range(nr):
        riga=nc*[0]
        m.append(riga)   
    return m

Utilizza la matrice nulla come griglia da riempire successivamente

Prodotto per uno scalare

def scalare(k, m1):   
    nr=len(m1) 
    nc=len(m1[0]) 

    m2=nulla(nr, nc)
    for r in range(nr):
        for c in range(nc):
            m2[r][c]=k*m1[r][c] 
    return m2


print(scalare(2, A))  # [ [4,14], [2, 0] ] 
print(scalare(2, B))  # [ [2, 4], [0, 8] ] 
print(scalare(2, C))  # [ [2, 16, 18], [0, 10, 18] ]

Somma

def somma(m1, m2):   
    nr1=len(m1)
    nc1=len(m1[0])
    nr2=len(m2)
    nc2=len(m2[0])
    if(nr1 != nr2) or (nc1 != nc2):
        return None

    m3=nulla(nr1, nc1)
    for r in range(nr1):
        for c in range(nc1):
            m3[r][c]=m1[r][c]+m2[r][c]
    return m3

print(somma(A, B))  # [[3, 9], [1, 4]]
print(somma(A, C))  # None
print(somma(B, C))  # None

Prodotto

def prodotto(m1, m2):   
    nr1=len(m1)
    nc1=len(m1[0])
    nr2=len(m2)
    nc2=len(m2[0])
    if(nc1 != nr2):
        return None

    m3=nulla(nr1, nc2)
    for r in range(nr1):
        for c in range(nc2):
            x=0  
            for k in range(nc1):
                x += m1[r][k] * m2[k][c]
            m3[r][c]=x   
    return m3 

print(prodotto(A, B))  # [[2,32]   , [1,2]    ]
print(prodotto(A, C))  # [[2,51,81], [1,8,9]  ]
print(prodotto(B, C))  # [[1,18,27], [0,20,36]]
print(prodotto(C, A))  # None