from typing import List import math from tabulate import tabulate def matmul(matrix_a: List[List[int]], matrix_b: List[List[int]]) -> List[List[int]]: """ Matrix multiplication :param matrix_a: Matrix A :param matrix_b: Matrix B :return: product of matrix_a and matrix_b :raises: ValueError: wenn Matrix A and Matrix B nicht multipliezierbar sind """ if len(matrix_a[0]) != len(matrix_b): print(len(matrix_a[0])) print(len(matrix_b)) raise ValueError("Matrix kann nicht multipliziert werden") ergebnis1 = [] ergebnis2 = [] result = 0 spalte_max = len(matrix_b[0]) zeile = 0 for spalte in range(len(matrix_a)): for zeile in range(spalte_max): for z in range(len(matrix_a[0])): zahl = matrix_a[spalte][z] * matrix_b[z][zeile] result = result + zahl ergebnis1.append(result) result = 0 ergebnis2.append(ergebnis1) ergebnis1 = [] return ergebnis2 def transpose(matrix: list[list[int]]) -> list[list[int]]: """ Transpose a matrix :param matrix: valid matrix :return: transpose of matrix """ if len(matrix) == 0: raise ValueError("Matrix leer") mindest_länge = len(matrix[0]) for zeile in range(len(matrix)): if len(matrix[zeile]) != mindest_länge : raise ValueError("Matrix falsch") anzahl_spalten= len(matrix) anzahl_zeilen= len(matrix[0]) ergebnis1 = [] ergebnis2 = [] for z in range(anzahl_zeilen): for s in range(anzahl_spalten): ergebnis1.append(matrix[s][z]) ergebnis2.append(ergebnis1) ergebnis1 = [] return ergebnis2 def rot_2D(angle: int) -> List[List[float]]: """ Rotation matrix :param angle: any angle in degrees :return: rotation matrix """ zahl1 = math.cos(math.radians(angle)) zahl2 = -math.sin(math.radians(angle)) zahl3 = math.sin(math.radians(angle)) zahl4 = math.cos(math.radians(angle)) return [[zahl1, zahl2], [zahl3, zahl4]] def rot_3D(angle: float, axis: str) -> List[List[float]]: """ Rotation matrix 3D :param angle: between 0 and 360 degrees :param axis: x,y,z axis of rotation matrix :return: 3D rotation matrix """ if angle > 360: raise ValueError("angle must be less than 360") elif angle < 0: raise ValueError("angle must be greater than 0") cos = math.cos(math.radians(angle)) sin = math.sin(math.radians(angle)) if axis == "x": return [[1,0,0],[0, cos, -sin],[0, sin, cos]] elif axis == "y": return [[cos, 0, sin],[0,1,0],[-sin,0,cos]] elif axis == "z": return [[cos, -sin, 0],[sin, cos, 0],[0, 0, 1]] else: raise ValueError("Not a valid axis. Choose from 'x', 'y', 'z'.") if __name__ == "__main__": print(rot_3D(90, "x"))