Erster Stand: compute.py
This commit is contained in:
commit
a0031cac58
4 files changed
+208
No files matched your search
@@ -0,0 +1,3 @@
|
||||
.venv/
|
||||
__pycache__/
|
||||
.env
|
||||
@@ -0,0 +1,4 @@
|
||||
# Regeln für dieses Projekt
|
||||
- Code nach PEP 8, Zeilenlänge maximal 88 Zeichen.
|
||||
- Jede Funktion und Methode hat einen Docstring und Type Hints.
|
||||
- Vor jedem Commit: `ruff check` und `ruff format`.
|
||||
+198
@@ -0,0 +1,198 @@
|
||||
import math
|
||||
|
||||
|
||||
def matmul(a: list[list[float]], b: list[list[float]]) -> list[list[float]]:
|
||||
"""Multiplicates two matrices.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
a : list[list[float]]
|
||||
Left matrix in row‑major order.
|
||||
b : list[list[float]]
|
||||
Right matrix in row‑major order.
|
||||
|
||||
Returns
|
||||
-------
|
||||
list[list[float]]
|
||||
Product matrix `c = a × b`.
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
If matrices are not rectangular or if the number of columns in ``a``
|
||||
does not equal the number of rows in ``b``.
|
||||
|
||||
Notes
|
||||
-----
|
||||
* Empty matrices (``[]``) yield an empty result.
|
||||
* The implementation uses pure Python lists and does not depend on
|
||||
external libraries such as NumPy.
|
||||
"""
|
||||
# Validate input matrices are non‑empty lists of lists
|
||||
if not isinstance(a, list) or not isinstance(b, list):
|
||||
raise ValueError("Both arguments must be lists of lists.")
|
||||
|
||||
# Handle empty matrices early – return empty list for any empty input
|
||||
if not a or not b:
|
||||
return []
|
||||
|
||||
# Determine dimensions of left matrix ``a``
|
||||
a_rows = len(a)
|
||||
a_cols = None
|
||||
for row in a:
|
||||
if not isinstance(row, list):
|
||||
raise ValueError("Matrix a must be a list of lists.")
|
||||
if a_cols is None:
|
||||
a_cols = len(row)
|
||||
elif len(row) != a_cols:
|
||||
raise ValueError("All rows in matrix a must have the same length.")
|
||||
|
||||
# Determine dimensions of right matrix ``b``
|
||||
b_rows = len(b)
|
||||
b_cols = None
|
||||
for row in b:
|
||||
if not isinstance(row, list):
|
||||
raise ValueError("Matrix b must be a list of lists.")
|
||||
if b_cols is None:
|
||||
b_cols = len(row)
|
||||
elif len(row) != b_cols:
|
||||
raise ValueError("All rows in matrix b must have the same length.")
|
||||
|
||||
# Check for dimensional compatibility between ``a`` and ``b``
|
||||
if a_cols != b_rows:
|
||||
raise ValueError(
|
||||
f"Matrix dimensions do not align: a.columns={a_cols} != b.rows={b_rows}"
|
||||
)
|
||||
|
||||
# Initialize result matrix with zeros – dimensions a_rows × b_cols
|
||||
result = [[0.0 for _ in range(b_cols)] for _ in range(a_rows)]
|
||||
|
||||
# Perform multiplication: iterate over rows of ``a`` and columns of ``b``
|
||||
for i in range(a_rows):
|
||||
for j in range(b_cols):
|
||||
s = 0.0
|
||||
for k in range(a_cols):
|
||||
s += a[i][k] * b[k][j]
|
||||
result[i][j] = s
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def transpose(a: list[list[float]]) -> list[list[float]]:
|
||||
"""Transposes a matrix.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
a : list[list[float]]
|
||||
Matrix in row‑major order.
|
||||
|
||||
Returns
|
||||
-------
|
||||
list[list[float]]
|
||||
Transposed matrix where rows and columns are swapped.
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
If the matrix is not rectangular.
|
||||
|
||||
Notes
|
||||
-----
|
||||
* Empty matrices (``[]``) yield an empty result.
|
||||
* The implementation uses pure Python lists and does not depend on
|
||||
external libraries such as NumPy.
|
||||
"""
|
||||
# Validate input is a list
|
||||
if not isinstance(a, list):
|
||||
raise ValueError("Argument must be a list of lists.")
|
||||
|
||||
# Handle empty matrix early – return empty list
|
||||
if not a:
|
||||
return []
|
||||
|
||||
# Determine dimensions and check rectangularity
|
||||
rows = len(a)
|
||||
cols = None
|
||||
for row in a:
|
||||
if not isinstance(row, list):
|
||||
raise ValueError("Matrix must be a list of lists.")
|
||||
if cols is None:
|
||||
cols = len(row)
|
||||
elif len(row) != cols:
|
||||
raise ValueError("All rows in the matrix must have the same length.")
|
||||
|
||||
# Build transposed matrix with dimensions cols × rows
|
||||
result = [[a[i][j] for i in range(rows)] for j in range(cols)]
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def rot_2D(angle: float) -> list[list[float]]:
|
||||
"""Creates a 2×2 rotation matrix.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
angle : float
|
||||
Rotation angle in radians (counter‑clockwise).
|
||||
|
||||
Returns
|
||||
-------
|
||||
list[list[float]]
|
||||
Matrix ``[[cos(angle), -sin(angle)], [sin(angle), cos(angle)]]``.
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
If ``angle`` is not a real number.
|
||||
|
||||
Notes
|
||||
-----
|
||||
* The implementation uses pure Python lists and does not depend on
|
||||
external libraries such as NumPy.
|
||||
"""
|
||||
# Validate input is a real number
|
||||
if not isinstance(angle, (int, float)) or isinstance(angle, bool):
|
||||
raise ValueError("Angle must be a real number (radians).")
|
||||
|
||||
c = math.cos(angle)
|
||||
s = math.sin(angle)
|
||||
|
||||
return [[c, -s], [s, c]]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Beispiel 1: 2x3 × 3x2
|
||||
a = [[1, 2, 3], [4, 5, 6]]
|
||||
b = [[7, 8], [9, 10], [11, 12]]
|
||||
print("Beispiel 1 Ergebnis:")
|
||||
for row in matmul(a, b):
|
||||
print(row)
|
||||
|
||||
# Beispiel 2: 2x2 × 2x2
|
||||
a2 = [[1, 0], [0, 1]]
|
||||
b2 = [[5, 6], [7, 8]]
|
||||
print("\nBeispiel 2 Ergebnis:")
|
||||
for row in matmul(a2, b2):
|
||||
print(row)
|
||||
|
||||
# Beispiel 3: Transponieren einer 2x3-Matrix -> 3x2
|
||||
m = [[1, 2, 3], [4, 5, 6]]
|
||||
print("\nBeispiel 3 Original:")
|
||||
for row in m:
|
||||
print(row)
|
||||
print("Beispiel 3 Transponiert:")
|
||||
for row in transpose(m):
|
||||
print(row)
|
||||
|
||||
# Beispiel 4: Rotationsmatrix (90°) und Probe durch Drehen von (1, 0)
|
||||
r = rot_2D(math.pi / 2)
|
||||
print("\nBeispiel 4 Rotationsmatrix (90°):")
|
||||
for row in r:
|
||||
print(row)
|
||||
print("Beispiel 4 Vektor (1, 0) nach 90°:")
|
||||
for row in matmul(r, [[1.0], [0.0]]):
|
||||
print([round(v, 10) for v in row])
|
||||
|
||||
# Docstring und Type Hints sind vorhanden und stimmen mit dem Code überein.
|
||||
# Fehlerfälle werden behandelt
|
||||
# Namen sind Aussagekräftig
|
||||
@@ -0,0 +1,3 @@
|
||||
[project]
|
||||
name = "matrixmania"
|
||||
version = "0.1.0"
|
||||
Reference in new issue
Block a user