105 lines
2.8 KiB
Python
105 lines
2.8 KiB
Python
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
|
|
"""
|
|
|
|
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"))
|
|
print(transpose([
|
|
[1, 2, 3],
|
|
[4, 5, 6]
|
|
])) |