added matrix
This commit is contained in:
parent
2de8ca6432
commit
687ec9b6b1
2
main.py
2
main.py
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
import fixpoint_approximation
|
import fixpoint_approximation
|
||||||
import linear_approximation
|
import linear_approximation
|
||||||
|
import matrix
|
||||||
import newton_polynom
|
import newton_polynom
|
||||||
import zero_point_approximation
|
import zero_point_approximation
|
||||||
|
|
||||||
|
@ -25,3 +26,4 @@ if __name__ == '__main__':
|
||||||
fixpoint_approximation.test()
|
fixpoint_approximation.test()
|
||||||
newton_polynom.test()
|
newton_polynom.test()
|
||||||
zero_point_approximation.test()
|
zero_point_approximation.test()
|
||||||
|
matrix.test()
|
||||||
|
|
|
@ -0,0 +1,165 @@
|
||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
class Matrix:
|
||||||
|
|
||||||
|
def __init__(self, rows, cols):
|
||||||
|
self.rows = rows
|
||||||
|
self.cols = cols
|
||||||
|
|
||||||
|
self.fields = []
|
||||||
|
|
||||||
|
# initialize to identity matrix
|
||||||
|
for x in range(rows):
|
||||||
|
row = []
|
||||||
|
|
||||||
|
for y in range(cols):
|
||||||
|
row.append(float(x == y))
|
||||||
|
|
||||||
|
self.fields.append(row)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.fields.__str__()
|
||||||
|
|
||||||
|
# convert this matrix to identity
|
||||||
|
def to_identity(self):
|
||||||
|
for x in range(self.rows):
|
||||||
|
for y in range(self.cols):
|
||||||
|
self.fields[x][y] = float(x == y)
|
||||||
|
|
||||||
|
def transpose(self):
|
||||||
|
result = Matrix(self.cols, self.rows)
|
||||||
|
|
||||||
|
for x in range(self.rows):
|
||||||
|
for y in range(self.cols):
|
||||||
|
result.fields[y][x] = self.fields[x][y]
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def __mul__(self, other):
|
||||||
|
result = Matrix(self.rows, other.cols)
|
||||||
|
|
||||||
|
for x in range(self.rows):
|
||||||
|
for y in range(other.cols):
|
||||||
|
sum = 0
|
||||||
|
|
||||||
|
for i in range(self.cols):
|
||||||
|
sum += self.fields[x][i] * other.fields[i][y]
|
||||||
|
|
||||||
|
result.fields[x][y] = sum
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def scale(self, other):
|
||||||
|
result = Matrix(self.rows, other.cols)
|
||||||
|
|
||||||
|
for x in range(self.rows):
|
||||||
|
for y in range(other.cols):
|
||||||
|
|
||||||
|
result.fields[x][y] = self.fields[x][y] * other
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def __add__(self, other):
|
||||||
|
result = Matrix(self.rows, self.cols)
|
||||||
|
|
||||||
|
for x in range(self.rows):
|
||||||
|
for y in range(self.cols):
|
||||||
|
result.fields[x][y] = self.fields[x][y] + other.fields[x][y]
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def __sub__(self, other):
|
||||||
|
result = Matrix(self.rows, self.cols)
|
||||||
|
|
||||||
|
for x in range(self.rows):
|
||||||
|
for y in range(self.cols):
|
||||||
|
result.fields[x][y] = self.fields[x][y] - other.fields[x][y]
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def slice(self, row_min, row_max, col_min, col_max):
|
||||||
|
rows = row_max - row_min
|
||||||
|
cols = col_max - col_min
|
||||||
|
|
||||||
|
result = Matrix(rows, cols)
|
||||||
|
|
||||||
|
for x in range(row_min, row_max):
|
||||||
|
for y in range(col_min, col_max):
|
||||||
|
result.fields[x][y] = self.fields[x][y]
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def exclude_row_and_col(self, i):
|
||||||
|
result = Matrix(self.rows - 1, self.cols - 1)
|
||||||
|
|
||||||
|
for x in range(i):
|
||||||
|
for y in range(i):
|
||||||
|
result.fields[x][y] = self.fields[x][y]
|
||||||
|
|
||||||
|
for x in range(i + 1, self.rows - 1):
|
||||||
|
for y in range(i + 1, self.cols - 1):
|
||||||
|
result.fields[x][y] = self.fields[x][y]
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def determinant(self):
|
||||||
|
if self.rows == 2 and self.cols == 2:
|
||||||
|
return self.fields[0][0] * self.fields[1][1] - self.fields[0][1] * self.fields[1][0]
|
||||||
|
|
||||||
|
# Satz von Sarrus
|
||||||
|
if self.rows == 3 and self.cols == 3:
|
||||||
|
aei = self.fields[0][0] * self.fields[1][1] * self.fields[2][2]
|
||||||
|
bfg = self.fields[0][1] * self.fields[1][2] * self.fields[2][0]
|
||||||
|
cdh = self.fields[0][2] * self.fields[1][0] * self.fields[2][1]
|
||||||
|
ceg = self.fields[0][2] * self.fields[1][1] * self.fields[2][0]
|
||||||
|
afh = self.fields[0][0] * self.fields[1][2] * self.fields[2][1]
|
||||||
|
bdi = self.fields[0][1] * self.fields[1][0] * self.fields[2][2]
|
||||||
|
return aei + bfg + cdh - ceg - afh - bdi
|
||||||
|
|
||||||
|
# Laplace
|
||||||
|
if self.rows == self.cols:
|
||||||
|
# perform laplace on 2nd row
|
||||||
|
self.__laplace_row(1)
|
||||||
|
|
||||||
|
def __laplace_row(self, i):
|
||||||
|
sum = 0
|
||||||
|
for i in range(self.rows):
|
||||||
|
sum += math.pow(-1, i + 1) * self.exclude_row_and_col(i).determinant()
|
||||||
|
|
||||||
|
return sum
|
||||||
|
|
||||||
|
def cramer(self, vector, order):
|
||||||
|
return Matrix.from_vector(vector, order).determinant() / self.determinant()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_array(cls, array):
|
||||||
|
matrix = Matrix(rows=len(array), cols=len(array[0]))
|
||||||
|
|
||||||
|
for y in range(matrix.cols):
|
||||||
|
for x in range(matrix.rows):
|
||||||
|
matrix.fields[x][y] = array[x][y]
|
||||||
|
|
||||||
|
return matrix
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_vector(cls, vector, column):
|
||||||
|
matrix = Matrix(rows=len(vector), cols=len(vector))
|
||||||
|
|
||||||
|
for y in range(matrix.rows):
|
||||||
|
matrix.fields[y][column] = vector[y]
|
||||||
|
|
||||||
|
return matrix
|
||||||
|
|
||||||
|
def test():
|
||||||
|
mat1 = Matrix.from_array([
|
||||||
|
[2, -4],
|
||||||
|
[3, 1],
|
||||||
|
[-2, 1]
|
||||||
|
])
|
||||||
|
mat2 = Matrix.from_array([
|
||||||
|
[2, -2, 3],
|
||||||
|
[-3, 4, -4]
|
||||||
|
])
|
||||||
|
|
||||||
|
print(mat1 * mat2)
|
Loading…
Reference in New Issue