Files
2026-10-15 17:09:26 +02:00

115 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Einfache Matrixoperationen:
Multiplikation, Transponieren und Drehung um 90° im Uhrzeigersinn.
"""
from __future__ import annotations
from typing import List
# Eine Matrix ist hier eine Liste von Zeilen mit Zahlen.
Matrix = List[List[float]]
def matmul(A: Matrix, B: Matrix) -> Matrix:
"""Multipliziert zwei Matrizen A und B."""
# Leere Matrizen sind nicht erlaubt.
if not A or not B:
raise ValueError("Matrizen dürfen nicht leer sein")
# Prüfen, ob alle Zeilen von A gleich lang sind.
spalten_A = len(A[0])
if any(len(zeile) != spalten_A for zeile in A):
raise ValueError("Matrix A ist nicht rechteckig")
# Prüfen, ob alle Zeilen von B gleich lang sind.
spalten_B = len(B[0])
if any(len(zeile) != spalten_B for zeile in B):
raise ValueError("Matrix B ist nicht rechteckig")
# Für A × B muss die Spaltenzahl von A
# der Zeilenzahl von B entsprechen.
if spalten_A != len(B):
raise ValueError(
f"Multiplikation nicht möglich: A hat {spalten_A} Spalten, "
f"B hat {len(B)} Zeilen"
)
ergebnis: Matrix = []
# Jede Zeile von A mit jeder Spalte von B kombinieren.
for i in range(len(A)):
ergebnis_zeile: List[float] = []
for j in range(spalten_B):
# Produkte der passenden Elemente bilden und addieren.
wert = sum(A[i][k] * B[k][j] for k in range(spalten_A))
ergebnis_zeile.append(wert)
ergebnis.append(ergebnis_zeile)
return ergebnis
def transpose(M: Matrix) -> Matrix:
"""Vertauscht Zeilen und Spalten einer Matrix."""
if not M:
raise ValueError("Matrix darf nicht leer sein")
# Eine rechteckige Matrix muss gleich lange Zeilen haben.
spalten = len(M[0])
if any(len(zeile) != spalten for zeile in M):
raise ValueError("Matrix ist nicht rechteckig")
# Die Elemente jeder Spalte werden zu einer neuen Zeile.
return [[M[i][j] for i in range(len(M))] for j in range(spalten)]
def rotate90_clockwise(M: Matrix) -> Matrix:
"""Dreht eine Matrix um 90° im Uhrzeigersinn."""
if not M:
raise ValueError("Matrix darf nicht leer sein")
spalten = len(M[0])
if any(len(zeile) != spalten for zeile in M):
raise ValueError("Matrix ist nicht rechteckig")
# Erst transponieren, dann jede neue Zeile umkehren.
transponiert = [
[M[i][j] for i in range(len(M))]
for j in range(spalten)
]
return [zeile[::-1] for zeile in transponiert]
if __name__ == "__main__":
# Beispiel: Eine 2×3-Matrix mal eine 3×2-Matrix.
A = [[1, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
print("A × B:")
print(matmul(A, B)) # [[58, 64], [139, 154]]
# Eine Einheitsmatrix verändert eine Matrix bei der Multiplikation nicht.
C = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
D = [[2, 3, 4], [5, 6, 7], [8, 9, 10]]
print("D × C:")
print(matmul(D, C)) # ergibt wieder D
# Zeilen und Spalten tauschen.
E = [[1, 2, 3], [4, 5, 6]]
print("Transponierte Matrix:")
print(transpose(E)) # [[1, 4], [2, 5], [3, 6]]
# Erst transponieren, dann die Zeilen umkehren.
F = [[1, 2, 3], [4, 5, 6]]
print("90° im Uhrzeigersinn gedreht:")
print(rotate90_clockwise(F)) # [[4, 1], [5, 2], [6, 3]]
def rot_2D(theta: float):
"""Return a 2x2 rotation matrix for angle theta in radians."""
import math
c = math.cos(theta)
s = math.sin(theta)
return [[c, -s], [s, c]]
# Katzen-Test