Detta skapar en PDF som du sedan kan skriva ut. Du kan även spara ner PDFn och skriva ut senare.
Titel på utskriften?
Tack för ditt bidrag
Om vi kan använda det så lägger vi upp det på sidan. Nedan en länk till ditt bidrag om du vill spara det.
Spara som ...
Du sparar ditt skript under detta namn och kan sedan hämta tillbaka det med samma namn.
Läs in
Läs in ett tidigare sparat skript. Obs att du enbart kan läsa in skript i den webbläsare där du sparade skriptet. Vill du kunna läsa in och spara skript oberoende av webbläsare, så behöver du skaffa ett login (enkelt och gratis).
Skicka in bidrag
Föreslå rubrik
Beskriv vad din kod gör
Skapa kort länk
Använd en kort URL för att skicka länk till koden via SMS eller epost. När mottagaren klickar på länken, så öppnas denna webbsida, med din kod och din text. Länken rensas bort automatiskt om den inte används.
Rubrik (frivilligt)
Beskrivning (frivilligt)
Länk (kopiera hela)
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.
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
1*1 + 2*4 + 3*7 = 1 + 8 + 21 = 30
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
4*1 + 5*4 + 6*7= 4 + 20 + 42 = 66
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
7*1 + 8*4 + 9*7 = 7 + 32 + 63 = 102
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
1*2 + 2*5 + 3*8 = 2 + 10 + 24 = 36
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
4*2 + 5*5 + 6*8 = 8 + 25 + 48 = 81
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
7*2 + 8*5 + 9*8 = 14 + 40 + 72 = 126
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
1*3 + 2*6 + 3*9 = 3 + 12 + 27 = 42
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
4*3 + 5*6 + 6*9 = 12 + 30 + 54 = 96
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
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)
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)
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
=
30
36
42
66
81
96
102
126
150
3x2 multiplicerat med 2x1
Eftersom vi multiplicerar en 3x2 med 2x1 så får vi en matris med storlek 3x1.
1
2
3
4
5
1
2
4
=
10
22
14
1*2 + 2*4 = 2 + 8 = 10
1
2
3
4
5
1
2
4
=
10
22
14
3*2 + 4*4 = 6 + 16 = 22
1
2
3
4
5
1
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)
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)