Stand_1_compute.py
This commit is contained in:
commit
cccc5e57f0
1 file changed
+118
+118
@@ -0,0 +1,118 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
|
||||
|
||||
def rot_2D(theta: float) -> list[list[float]]:
|
||||
"""Erzeuge die 2D-Rotationsmatrix fuer eine Drehung um theta.
|
||||
|
||||
Args:
|
||||
theta: Drehwinkel im Bogenmaß (Gegen den Uhrzeigersinn).
|
||||
|
||||
Returns:
|
||||
Rotationsmatrix der Form 2 x 2:
|
||||
[[cos(theta), -sin(theta)], [sin(theta), cos(theta)]].
|
||||
"""
|
||||
c = math.cos(theta)
|
||||
s = math.sin(theta)
|
||||
return [[c, -s], [s, c]]
|
||||
|
||||
|
||||
def matmul(a: list[list[float]], b: list[list[float]]) -> list[list[float]]:
|
||||
"""Multipliziere zwei Matrizen a (m x n) und b (n x p).
|
||||
|
||||
Args:
|
||||
a: Matrix als Liste von Zeilen, Form m x n.
|
||||
b: Matrix als Liste von Zeilen, Form n x p.
|
||||
|
||||
Returns:
|
||||
Ergebnis c der Form m x p mit c[i][j] = sum(a[i][k] * b[k][j]).
|
||||
|
||||
Raises:
|
||||
ValueError: wenn a oder b keine rechteckige Matrix ist, oder
|
||||
wenn die Spaltenzahl von a ungleich der Zeilenzahl von b ist.
|
||||
"""
|
||||
if not a or not b:
|
||||
raise ValueError("Matrizen duerfen nicht leer sein.")
|
||||
|
||||
n = len(a[0])
|
||||
if any(len(row) != n for row in a):
|
||||
raise ValueError("Matrix a ist nicht rechteckig.")
|
||||
if any(len(row) != len(b[0]) for row in b):
|
||||
raise ValueError("Matrix b ist nicht rechteckig.")
|
||||
|
||||
m = len(a)
|
||||
k = len(b)
|
||||
p = len(b[0])
|
||||
|
||||
if n != k:
|
||||
raise ValueError(f"Dimensionen passen nicht: a ist {m}x{n}, b ist {k}x{p}.")
|
||||
|
||||
return [
|
||||
[sum(a[i][t] * b[t][j] for t in range(n)) for j in range(p)] for i in range(m)
|
||||
]
|
||||
|
||||
|
||||
def transpose(a: list[list[float]]) -> list[list[float]]:
|
||||
"""Transponiere eine Matrix a (m x n) zu a^T (n x m).
|
||||
|
||||
Args:
|
||||
a: Matrix als Liste von Zeilen, Form m x n.
|
||||
|
||||
Returns:
|
||||
Ergebnis a^T der Form n x m mit a^T[j][i] = a[i][j].
|
||||
|
||||
Raises:
|
||||
ValueError: wenn a leer oder nicht rechteckig ist.
|
||||
"""
|
||||
if not a:
|
||||
raise ValueError("Matrix darf nicht leer sein.")
|
||||
|
||||
n = len(a[0])
|
||||
if any(len(row) != n for row in a):
|
||||
raise ValueError("Matrix ist nicht rechteckig.")
|
||||
|
||||
return [list(col) for col in zip(*a)]
|
||||
|
||||
|
||||
def rotate(a: list[list[float]]) -> list[list[float]]:
|
||||
"""Rotiere eine Matrix a um 90 Grad im Uhrzeigersinn.
|
||||
|
||||
Args:
|
||||
a: Matrix als Liste von Zeilen, Form m x n.
|
||||
|
||||
Returns:
|
||||
Neue Matrix der Form n x m.
|
||||
|
||||
Raises:
|
||||
ValueError: wenn a leer oder nicht rechteckig ist.
|
||||
"""
|
||||
return [list(reversed(row)) for row in transpose(a)]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
a = [[1, 2, 3], [4, 5, 6]]
|
||||
b = [[7, 8], [9, 10], [11, 12]]
|
||||
|
||||
product = matmul(a, b)
|
||||
assert product == [[58, 64], [139, 154]]
|
||||
print("matmul:", product)
|
||||
|
||||
transposed = transpose(a)
|
||||
assert transposed == [[1, 4], [2, 5], [3, 6]]
|
||||
print("transpose:", transposed)
|
||||
assert transpose(transpose(a)) == a
|
||||
|
||||
rotated = rotate(a)
|
||||
assert rotated == [[4, 1], [5, 2], [6, 3]]
|
||||
print("rotate:", rotated)
|
||||
assert rotate(rotate(rotate(rotate(a)))) == a
|
||||
|
||||
# Rotation um 90 Grad (pi/2) bildet (1, 0) auf (0, 1) ab.
|
||||
assert rot_2D(0) == [[1, 0], [0, 1]]
|
||||
quarter = rot_2D(math.pi / 2)
|
||||
point = transpose([[1.0, 0.0]])
|
||||
result = matmul(quarter, point)
|
||||
assert abs(result[0][0]) < 1e-9
|
||||
assert abs(result[1][0] - 1.0) < 1e-9
|
||||
print("rot_2D:", quarter)
|
||||
Reference in new issue
Block a user