From 7f0bb6e239c3fe421a1d7d39e1c3af940645389d Mon Sep 17 00:00:00 2001 From: alexandradro Date: Thu, 22 Oct 2026 02:35:05 +0200 Subject: [PATCH] Erster Stand:compute.py --- .gitignore | 3 + .idea/.gitignore | 5 + .idea/MatrixMania.iml | 10 ++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 6 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ AGENTS.md | 4 + compute.py | 93 +++++++++++++++++++ pyproject.toml | 3 + 10 files changed, 144 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/MatrixMania.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 AGENTS.md create mode 100644 compute.py create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e34adb --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +#.venv/ + #__pycache__/ + #.env diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/MatrixMania.iml b/.idea/MatrixMania.iml new file mode 100644 index 0000000..57669e6 --- /dev/null +++ b/.idea/MatrixMania.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..48b30d4 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..55c2805 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..79a2eba --- /dev/null +++ b/AGENTS.md @@ -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`. \ No newline at end of file diff --git a/compute.py b/compute.py new file mode 100644 index 0000000..ac39944 --- /dev/null +++ b/compute.py @@ -0,0 +1,93 @@ +"""Hilfsfunktionen für grundlegende Matrixoperationen.""" + +from __future__ import annotations +from typing import List, Sequence, TypeVar + +Number = TypeVar("Number", int, float) + + +def matmul(a: Sequence[Sequence[Number]], b: Sequence[Sequence[Number]]) -> List[List[Number]]: + """ + Multipliziert zwei Matrizen miteinander. + + :param a: Die linke Matrix der Dimension (m, n). + :type a: Sequence[Sequence[Number]] + :param b: Die rechte Matrix der Dimension (n, p). + :type b: Sequence[Sequence[Number]] + :return: Die entstehende Ergebnismatrix der Dimension (m, p). + :rtype: List[List[Number]] + :raises ValueError: Wenn die Matrizen aufgrund inkompatibler + Dimensionen oder unregelmäßiger Form nicht multipliziert werden können. + """ + if not a or not b: + raise ValueError("Matrix-Eingaben dürfen nicht leer sein") + + m = len(a) + n = len(a[0]) + for row in a: + if len(row) != n: + raise ValueError("Matrix a ist nicht rechteckig") + + if len(b) != n: + raise ValueError("Die Anzahl der Spalten in a muss der Anzahl der Zeilen in b entsprechen") + p = len(b[0]) + for row in b: + if len(row) != p: + raise ValueError("Matrix b ist nicht rechteckig") + + result: List[List[Number]] = [[0 for _ in range(p)] for _ in range(m)] + for i in range(m): + for j in range(p): + total: Number = 0 + for k in range(n): + total += a[i][k] * b[k][j] + result[i][j] = total + return result + + +def transpose(matrix: Sequence[Sequence[Number]]) -> List[List[Number]]: + """ + Transponiert eine Matrix. + + :param matrix: Die Eingabematrix der Dimension (m, n). + :type matrix: Sequence[Sequence[Number]] + :return: Die transponierte Matrix der Dimension (n, m). + :rtype: List[List[Number]] + :raises ValueError: Wenn die Matrix leer ist oder Zeilen unterschiedlicher Länge hat. + """ + if not matrix or not matrix[0]: + raise ValueError("Matrix darf nicht leer sein") + + row_len = len(matrix[0]) + for row in matrix: + if len(row) != row_len: + raise ValueError("Die Zeilen der Matrix haben unterschiedliche Längen") + + n_rows = len(matrix) + n_cols = row_len + transposed: List[List[Number]] = [[0] * n_rows for _ in range(n_cols)] + for i in range(n_rows): + for j in range(n_cols): + transposed[j][i] = matrix[i][j] + return transposed + + +import math + + +def rot_2D(theta: Number) -> List[List[Number]]: + """ + Erstellt die 2D-Rotationsmatrix für einen gegebenen Winkel. + + :param theta: Der Winkel in Bogenmaß (Radiant). + :type theta: Number + :return: Die Rotationsmatrix ``[[cos(theta), -sin(theta)], [sin(theta), cos(theta)]]``. + :rtype: List[List[Number]] + :raises TypeError: Wenn theta kein numerischer Typ ist. + """ + if not isinstance(theta, (int, float)): + raise TypeError("theta muss numerisch sein (int oder float)") + + cos_t = math.cos(theta) + sin_t = math.sin(theta) + return [[cos_t, -sin_t], [sin_t, cos_t]] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..46e3b47 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[project] +name = "matrixmania" +version = "0.1.0" \ No newline at end of file