compute hinzugefügt
This commit is contained in:
1 parent
6c253ae620
commit
efbd44d182
1 file changed
+169
+169
@@ -0,0 +1,169 @@
|
|||||||
|
"""Modul zur Matrizenmultiplikation."""
|
||||||
|
from __future__ import annotations
|
||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
Matrix = list[list[float]]
|
||||||
|
|
||||||
|
|
||||||
|
def matmul(a: Matrix, b: Matrix) -> Matrix:
|
||||||
|
"""Multipliziert zwei Matrizen a * b.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
a: Erste Matrix der Dimension (m x n).
|
||||||
|
b: Zweite Matrix der Dimension (n x p).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Ergebnismatrix der Dimension (m x p).
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: Wenn die Matrizen leer sind, unregulär sind
|
||||||
|
(ungleiche Zeilenlängen) oder die Innen Dimensionen
|
||||||
|
nicht zusammenpassen (a.Zeilen != b.Spalten).
|
||||||
|
"""
|
||||||
|
if not a or not b:
|
||||||
|
raise ValueError("Matrizen duerfen nicht leer sein.")
|
||||||
|
|
||||||
|
rows_a = len(a)
|
||||||
|
cols_a = len(a[0])
|
||||||
|
rows_b = len(b)
|
||||||
|
cols_b = len(b[0])
|
||||||
|
|
||||||
|
for row in a:
|
||||||
|
if len(row) != cols_a:
|
||||||
|
raise ValueError("Matrix a ist nicht rechteckig.")
|
||||||
|
for row in b:
|
||||||
|
if len(row) != cols_b:
|
||||||
|
raise ValueError("Matrix b ist nicht rechteckig.")
|
||||||
|
|
||||||
|
if cols_a != rows_b:
|
||||||
|
raise ValueError(
|
||||||
|
f"Nicht passende Dimensionen: a ist {rows_a}x{cols_a}, "
|
||||||
|
f"b ist {rows_b}x{cols_b} (a.Spalten muss b.Zeilen sein)."
|
||||||
|
)
|
||||||
|
|
||||||
|
result: Matrix = []
|
||||||
|
for i in range(rows_a):
|
||||||
|
new_row: list[float] = []
|
||||||
|
for j in range(cols_b):
|
||||||
|
new_row.append(sum(a[i][k] * b[k][j] for k in range(cols_a)))
|
||||||
|
result.append(new_row)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def transpose(m: Matrix) -> Matrix:
|
||||||
|
"""Transponiert die gegebene Matrix.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
m: Matrix von Dimension (rows x cols).
|
||||||
|
Returns:
|
||||||
|
Eine neue Matrix mit umgekehrter Dimension (cols x rows).
|
||||||
|
"""
|
||||||
|
if not m:
|
||||||
|
raise ValueError("Matrix darf nicht leer sein.")
|
||||||
|
rows = len(m)
|
||||||
|
cols = len(m[0])
|
||||||
|
# überprüfen, ob die Matrix rechteckig ist
|
||||||
|
for row in m:
|
||||||
|
if len(row) != cols:
|
||||||
|
raise ValueError("Matrix ist nicht rechteckig.")
|
||||||
|
# Transponieren
|
||||||
|
return [[m[r][c] for r in range(rows)] for c in range(cols)]
|
||||||
|
|
||||||
|
def rot_2D(m: Matrix | float) -> Matrix:
|
||||||
|
"""Rotiert die Matrix um 90 Grad im Uhrzeigersinn.
|
||||||
|
|
||||||
|
Falls ``m`` ein Zahlenwert ist, wird die Rotationsmatrix
|
||||||
|
für den Winkel ``m`` (in Bogenmaß) zurückgegeben. Andernfalls
|
||||||
|
wird die Matrix um 90° gedreht.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
m: Eingabe‑Matrix oder Winkel in Radiant.
|
||||||
|
Returns:
|
||||||
|
Rotierte Matrix bzw. 2×2‑Rotationsmatrix.
|
||||||
|
"""
|
||||||
|
if isinstance(m, (int, float)):
|
||||||
|
theta = float(m)
|
||||||
|
c = math.cos(theta)
|
||||||
|
s = math.sin(theta)
|
||||||
|
return [[c, -s], [s, c]]
|
||||||
|
# Ansonsten normal 90°‑Rotation (wie bisher)
|
||||||
|
if not m:
|
||||||
|
raise ValueError("Matrix darf nicht leer sein.")
|
||||||
|
rows = len(m)
|
||||||
|
cols = len(m[0])
|
||||||
|
for row in m:
|
||||||
|
if len(row) != cols:
|
||||||
|
raise ValueError("Matrix ist nicht rechteckig.")
|
||||||
|
return [[m[row][col] for row in reversed(range(rows))] for col in range(cols)]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Beispiel 1: klassischer Fall 2x3 * 3x2 -> 2x2
|
||||||
|
a1 = [[1, 2, 3],
|
||||||
|
[4, 5, 6]]
|
||||||
|
b1 = [[7, 8],
|
||||||
|
[9, 10],
|
||||||
|
[11, 12]]
|
||||||
|
expected1 = [[58, 64],
|
||||||
|
[139, 154]]
|
||||||
|
got1 = matmul(a1, b1)
|
||||||
|
assert got1 == expected1, f"Beispiel 1 fehlgeschlagen: {got1}"
|
||||||
|
print("Beispiel 1 ok:", got1)
|
||||||
|
|
||||||
|
# Beispiel 4: Transponieren einer 3x2 Matrix -> 2x3
|
||||||
|
m4 = [[1, 2],
|
||||||
|
[3, 4],
|
||||||
|
[5, 6]]
|
||||||
|
expected4 = [[1, 3, 5],
|
||||||
|
[2, 4, 6]]
|
||||||
|
got4 = transpose(m4)
|
||||||
|
assert got4 == expected4, f"Beispiel 4 fehlgeschlagen: {got4}"
|
||||||
|
print("Beispiel 4 ok:", got4)
|
||||||
|
|
||||||
|
# Beispiel 5: Transponieren einer Einheitsmatrix -> gleich
|
||||||
|
e5 = [[1, 0, 0],
|
||||||
|
[0, 1, 0],
|
||||||
|
[0, 0, 1]]
|
||||||
|
got5 = transpose(e5)
|
||||||
|
assert got5 == e5, f"Beispiel 5 fehlgeschlagen: {got5}"
|
||||||
|
print("Beispiel 5 ok:", got5)
|
||||||
|
|
||||||
|
# Beispiel 6: Fehlerfall – transponieren leerer Matrix
|
||||||
|
try:
|
||||||
|
transpose([])
|
||||||
|
except ValueError as err:
|
||||||
|
print("Beispiel 6 ok (Fehler erwartet):", err)
|
||||||
|
|
||||||
|
m7 = [[1, 2, 3],
|
||||||
|
[4, 5, 6]]
|
||||||
|
expected7 = [[4, 1],
|
||||||
|
[5, 2],
|
||||||
|
[6, 3]]
|
||||||
|
got7 = rotate(m7)
|
||||||
|
assert got7 == expected7, f"Beispiel 7 fehlgeschlagen: {got7}"
|
||||||
|
print("Beispiel 7 ok:", got7)
|
||||||
|
|
||||||
|
# Beispiel 8: Rotation einer quadratischen 3x3 Matrix
|
||||||
|
m8 = [[1, 2, 3],
|
||||||
|
[4, 5, 6],
|
||||||
|
[7, 8, 9]]
|
||||||
|
expected8 = [[7, 4, 1],
|
||||||
|
[8, 5, 2],
|
||||||
|
[9, 6, 3]]
|
||||||
|
got8 = rotate(m8)
|
||||||
|
assert got8 == expected8, f"Beispiel 8 fehlgeschlagen: {got8}"
|
||||||
|
print("Beispiel 8 ok:", got8)
|
||||||
|
|
||||||
|
# Beispiel 9: Fehlerfall – Rotation leerer Matrix
|
||||||
|
try:
|
||||||
|
rotate([])
|
||||||
|
except ValueError as err:
|
||||||
|
print("Beispiel 9 ok (Fehler erwartet):", err)
|
||||||
|
else:
|
||||||
|
raise AssertionError("ValueError wurde nicht ausgeloest.")
|
||||||
|
|
||||||
Reference in new issue
Block a user