Start of matrixmania
This commit is contained in:
commit
395f20c534
4 files changed
+175
No files matched your search
@@ -0,0 +1,3 @@
|
||||
.venv/
|
||||
__pycache__/
|
||||
.env
|
||||
@@ -0,0 +1,5 @@
|
||||
# AGENTS.md
|
||||
## Code-Konventionen
|
||||
- PEP 8 einhalten, Zeilenlänge max. 88 Zeichen
|
||||
- Jede Funktion braucht Type Hints und einen Docstring
|
||||
- Nach Erstellung mit "ruff check" und "ruff format" prüfen
|
||||
+163
@@ -0,0 +1,163 @@
|
||||
"""Matrix operations module.
|
||||
|
||||
This module provides utilities for basic matrix arithmetic:
|
||||
* :func:`matmul` – standard matrix multiplication
|
||||
* :func:`transpose` – matrix transposition
|
||||
* :func:`rot_2D` – 2‑D rotation matrix generator
|
||||
|
||||
All functions validate inputs and raise ``ValueError`` where
|
||||
appropriate. Type hints use the built‑in ``list`` and ``int | float`` union.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
import math
|
||||
|
||||
# Public type alias for a matrix of numeric values.
|
||||
Matrix = list[list[int | float]]
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# matmul
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def matmul(a: Matrix, b: Matrix) -> Matrix:
|
||||
"""Multiply two matrices.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
a: Matrix
|
||||
Left‑hand operand. Must be a non‑empty, rectangular matrix.
|
||||
b: Matrix
|
||||
Right‑hand operand. Must be a non‑empty, rectangular matrix
|
||||
whose column count equals ``a``'s row count.
|
||||
|
||||
Returns
|
||||
-------
|
||||
Matrix
|
||||
Result of the matrix product ``a @ b``.
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
If either matrix is empty, not rectangular, or the inner
|
||||
dimensions do not agree.
|
||||
"""
|
||||
if not a or not a[0] or not b or not b[0]:
|
||||
raise ValueError("Both matrices must be non‑empty")
|
||||
|
||||
a_rows, a_cols = len(a), len(a[0])
|
||||
b_rows, b_cols = len(b), len(b[0])
|
||||
|
||||
if any(len(row) != a_cols for row in a):
|
||||
raise ValueError("Matrix 'a' is not rectangular")
|
||||
if any(len(row) != b_cols for row in b):
|
||||
raise ValueError("Matrix 'b' is not rectangular")
|
||||
if a_cols != b_rows:
|
||||
raise ValueError(
|
||||
f"Inner matrix dimensions must agree: a_cols={a_cols} != b_rows={b_rows}"
|
||||
)
|
||||
|
||||
result: Matrix = [[0 for _ in range(b_cols)] for _ in range(a_rows)]
|
||||
|
||||
for i in range(a_rows):
|
||||
for j in range(b_cols):
|
||||
s = 0
|
||||
for k in range(a_cols):
|
||||
s += a[i][k] * b[k][j]
|
||||
result[i][j] = s
|
||||
return result
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Transpose
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def transpose(mat: Matrix) -> Matrix:
|
||||
"""Return the transpose of a matrix.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
mat: Matrix
|
||||
Input matrix to transpose. Must be a non‑empty, rectangular matrix.
|
||||
|
||||
Returns
|
||||
-------
|
||||
Matrix
|
||||
Transposed matrix: columns become rows and vice versa.
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
If ``mat`` is empty or the rows have differing lengths.
|
||||
"""
|
||||
if not mat or not mat[0]:
|
||||
raise ValueError("Matrix must be non‑empty")
|
||||
|
||||
row_len = len(mat[0])
|
||||
if any(len(row) != row_len for row in mat):
|
||||
raise ValueError("Matrix must be rectangular – rows have varying lengths")
|
||||
|
||||
transposed: Matrix = [[mat[row][col] for row in range(len(mat))] for col in range(row_len)]
|
||||
return transposed
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Rotation matrix generator
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def rot_2D(theta: float) -> Matrix:
|
||||
"""Return a 2‑D rotation matrix for an angle ``theta``.
|
||||
|
||||
The matrix corresponds to a rotation about the origin by ``theta``
|
||||
radians (counter‑clockwise). For a vector ``(x, y)`` the rotated
|
||||
coordinates are obtained via ``matmul(rot_2D(theta), [x, y])``.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
theta: float
|
||||
Rotation angle in radians.
|
||||
|
||||
Returns
|
||||
-------
|
||||
Matrix
|
||||
2×2 rotation matrix.
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
Never raised – the function accepts any floating‑point value.
|
||||
"""
|
||||
c = math.cos(theta)
|
||||
s = math.sin(theta)
|
||||
return [[c, -s], [s, c]]
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Example usage / tests
|
||||
# ---------------------------------------------------------------------------
|
||||
if __name__ == "__main__":
|
||||
# Example multiply
|
||||
|
||||
matrix_a = [
|
||||
[3, 4, -1, 4],
|
||||
[-2, 2, 5, 1]
|
||||
]
|
||||
|
||||
matrix_b = [
|
||||
[1, 3, -2],
|
||||
[2, 5, 1],
|
||||
[-1, 4, -4],
|
||||
[2, 3, 6]
|
||||
]
|
||||
|
||||
matrix_c = matmul(matrix_a, matrix_b)
|
||||
print("Ergebnis C = A * B:")
|
||||
for row in matrix_c:
|
||||
print(row)
|
||||
|
||||
# Example transpose
|
||||
matrix_d = [[1, 2, 3], [4, 5, 6]]
|
||||
print("Transpose of", matrix_d, "=", transpose(matrix_d))
|
||||
|
||||
# Demonstrate rot_2D
|
||||
angle = math.radians(45)
|
||||
rot = rot_2D(angle)
|
||||
vec = [[1], [0]]
|
||||
print("Rotation matrix for 45°:", rot)
|
||||
print("Rotated vec:", matmul(rot, vec))
|
||||
@@ -0,0 +1,4 @@
|
||||
[project]
|
||||
name = "matrixmania"
|
||||
version = "0.1.0"
|
||||
dependencies = ["tabulate", "ruff"]
|
||||
Reference in new issue
Block a user