Start | matris multiplikation
 

multiplikation av matriser



Multiplikation av matriser är motorn i att rotera figurer i ett rum.

storlekar och regler

Den första matrisen måste ha lika många kolumner som den andra har rader, för att multiplikation ska vara möjlig. Dvs de måste ha storlek MxN reprektive NxP och resultatet får då storleken MxP. Om du mutiplicerar en 3x3 med en 3x3 -matris så blir resultatet en 3x3 -matris. Om du multiplicerar en 3x3 med en 3x1 -matris så blir svaret 3x1 -matris. Du kan inte multiplicera en 2x2 -matris med en 3x3 -matris.

3x3 multiplicerat med en 3x3


Nedan är ett exempel på en 3x3 matris multiplicerat med en annan 3x3 matris.

Tänk såhär, du multiplicerar talen i en rad med talen i en kolumn. Svaret hamnar i krysset av den rad och kolumn du multiplicerar. Om du gör detta för hand några gånger, så sitter det.

123
456
789
123
456
789
=
303642
668196
102126150

1*1 + 2*4 + 3*7 = 1 + 8 + 21 = 30

123
456
789
123
456
789
=
303642
668196
102126150

4*1 + 5*4 + 6*7= 4 + 20 + 42 = 66

123
456
789
123
456
789
=
303642
668196
102126150

7*1 + 8*4 + 9*7 = 7 + 32 + 63 = 102

123
456
789
123
456
789
=
303642
668196
102126150

1*2 + 2*5 + 3*8 = 2 + 10 + 24 = 36

123
456
789
123
456
789
=
303642
668196
102126150

4*2 + 5*5 + 6*8 = 8 + 25 + 48 = 81

123
456
789
123
456
789
=
303642
668196
102126150

7*2 + 8*5 + 9*8 = 14 + 40 + 72 = 126

123
456
789
123
456
789
=
303642
668196
102126150

1*3 + 2*6 + 3*9 = 3 + 12 + 27 = 42

123
456
789
123
456
789
=
303642
668196
102126150

4*3 + 5*6 + 6*9 = 12 + 30 + 54 = 96

123
456
789
123
456
789
=
303642
668196
102126150

7*3 + 8*6 + 9*9 = 21 + 48 + 81 = 150

metoden multiplyWith


Så, koden för detta blir ganska straight-forward. Metoden multiplyWith tar en matris som argument. Så, vi multiplicerar den matris vi befinner oss i, med en yttre matris. Det blir 3 loopar i varandra som utför operationerna ovan beskrivna.

for i in range(B.w):
    for j in range(self.h):
        for s in range(B.h):
            C[j][i]+= self.I[j][s] * B.I[s][i]


Vi kan använda pythons dundermetoder och definiera @ -operatorn med __matmul__ så att den anropar multiplyWith. Varför @ -operatorn? Därför att t.ex. numpy använder denna för matrismultiplikation och vi vill förstås vara lika coola!
class Matrix: def __init__(self, I=None): self.I = I self.w = len(self.I[0]) self.h = len(self.I) def __str__(self): s = str(self.h)+'x'+str(self.w)+"\n" for i in range(self.h): for j in range(self.w): s = s + "{:>4}".format(self.I[i][j]) s = s + "\n" return(s) def enhetsmatris(self): for i in range(self.h): for j in range(self.w): self.I[i][j]=1 if i==j else 0 return(Matrix(self.I)) def multiplyWith(self,B): C = [[0]*B.w for i in range(self.h)] for i in range(B.w): for j in range(self.h): for s in range(B.h): C[j][i]+= self.I[j][s] * B.I[s][i] return(Matrix(C)) def __matmul__(self,B): return(self.multiplyWith(B)) T2 = Matrix([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) U2 = Matrix([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) print(T2) print(U2) print(T2 @ U2)
123
456
789
123
456
789
=
303642
668196
102126150

3x2 multiplicerat med 2x1


Eftersom vi multiplicerar en 3x2 med 2x1 så får vi en matris med storlek 3x1.
12
34
51
2
4
=
10
22
14

1*2 + 2*4 = 2 + 8 = 10

12
34
51
2
4
=
10
22
14

3*2 + 4*4 = 6 + 16 = 22

12
34
51
2
4
=
10
22
14

5*2 + 1*4 = 10 + 4 = 14

class Matrix: def __init__(self, I=None): self.I = I self.w = len(self.I[0]) self.h = len(self.I) def __str__(self): s = str(self.h)+'x'+str(self.w)+"\n" for i in range(self.h): for j in range(self.w): s = s + "{:>4}".format(self.I[i][j]) s = s + "\n" return(s) def enhetsmatris(self): for i in range(self.h): for j in range(self.w): self.I[i][j]=1 if i==j else 0 return(Matrix(self.I)) def multiplyWith(self,B): C = [[0]*B.w for i in range(self.h)] for i in range(B.w): for j in range(self.h): for s in range(B.h): C[j][i]+= self.I[j][s] * B.I[s][i] return(Matrix(C)) def __matmul__(self,B): return(self.multiplyWith(B)) T = Matrix( [[1,2], [3,4], [5,1]]) U = Matrix( [[2], [4]]) print(T) print(U) V = T @ U print(V)
12
34
51
2
4
=
10
22
14

Nu när vi lärt oss multiplicera matriser, låt oss göra något roligt. T.ex. rotera en punkt genom att multiplicera matriser!
16.440153121948 ms