Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from .matrix import Matrix

__all__ = ['Matrix']

Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
class Matrix:
def __init__(self, data):
self._data = data
self.rows = len(data)
self.cols = len(data[0])

# Сложение матриц
def __add__(self, other):
result = [
[self._data[i][j] + other._data[i][j] for j in range(self.cols)]
for i in range(self.rows)
]
return Matrix(result)

# Умножение на константу
def __mul__(self, scalar):
result = [
[self._data[i][j] * scalar for j in range(self.cols)]
for i in range(self.rows)
]
return Matrix(result)

# Умножение матриц
def __matmul__(self, other):
result = [[0] * other.cols for _ in range(self.rows)]
for i in range(self.rows):
for j in range(other.cols):
for k in range(self.cols):
result[i][j] += self._data[i][k] * other._data[k][j]
return Matrix(result)

# Итерирование по матрице
def __iter__(self):
for row in self._data:
for element in row:
yield element

# Вычисление определителя
def determinant(self):
return self._det(self._data)

def _det(self, matrix):
n = len(matrix)
if n == 1:
return matrix[0][0]
if n == 2:
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]

det = 0
for col in range(n):
minor = [
[matrix[i][j] for j in range(n) if j != col]
for i in range(1, n)
]
det += ((-1) ** col) * matrix[0][col] * self._det(minor)
return det
37 changes: 37 additions & 0 deletions Control-works/Control-work-No.2/Task_1/src/test_matrix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from matrix_package import Matrix

def test_matrix():
"""Тест matrix.py"""
print("\nТЕСТ MATRIX.PY:")

# 1. Создание матрицы
M = Matrix([[1, 2], [3, 4]])
print(f"1. Матрица: {M._data}")

# 2. Сложение
M2 = M + M
print(f"2. M + M: {M2._data}")

# 3. Умножение на константу
M3 = M * 5
print(f"3. M * 5: {M3._data}")

# 4. Умножение матриц
A = Matrix([[1, 2], [3, 4]])
B = Matrix([[2, 0], [1, 2]])
C = A @ B
print(f"4. A @ B: {C._data}")

# 5. Определитель
det = M.determinant()
print(f"5. det(M): {det}")

# 6. Итерация
print(f"6. Элементы M:", end=" ")
for elem in M:
print(elem, end=" ")
print()

if __name__ == "__main__":
# Запуск тестов
test_matrix()
41 changes: 41 additions & 0 deletions Control-works/Control-work-No.2/Task_2/src/matrix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
class FrozenMatrix:
def __init__(self, matrix):
if isinstance(matrix, (list, tuple)):
self._matrix = tuple(tuple(row) for row in matrix)
elif isinstance(matrix, FrozenMatrix):
self._matrix = matrix._matrix
else:
raise TypeError("Ошибка")

@property
def shape(self):
if not self._matrix:
return (0, 0)
return (len(self._matrix), len(self._matrix[0]))

def __hash__(self):
return hash(self._matrix)

def __eq__(self, other):
if not isinstance(other, FrozenMatrix):
return False
return self._matrix == other._matrix

def __getitem__(self, key):
if isinstance(key, tuple):
row, col = key
return self._matrix[row][col]
return self._matrix[key]

def __iter__(self):
return iter(self._matrix)

def __repr__(self):
return f"FrozenMatrix({list(list(row) for row in self._matrix)})"

def __str__(self):
rows = ["[" + ", ".join(map(str, row)) + "]" for row in self._matrix]
return "[" + ",\n ".join(rows) + "]"

def __len__(self):
return len(self._matrix)
70 changes: 70 additions & 0 deletions Control-works/Control-work-No.2/Task_3/src/matrix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import numpy as np

def save_mtx(matrix, filename):
"""Сохраняет матрицу в MTX формате"""
rows, cols = matrix.shape

with open(filename, 'w') as f:
f.write("%%MatrixMarket matrix coordinate real general\n")

# Считаем ненулевые элементы
nonzero = []
for i in range(rows):
for j in range(cols):
if matrix[i, j] != 0:
nonzero.append((i+1, j+1, matrix[i, j]))

# Размеры
f.write(f"{rows} {cols} {len(nonzero)}\n")

# Данные
for i, j, val in nonzero:
f.write(f"{i} {j} {val:.15g}\n")

def load_mtx(filename):
"""Загружает матрицу из MTX формата"""
with open(filename, 'r') as f:
lines = f.readlines()

data_lines = []
for line in lines:
line = line.strip()
if line and not line.startswith('%'):
data_lines.append(line)

if not data_lines:
raise ValueError("Файл не содержит данных")

rows, cols, nnz = map(int, data_lines[0].split())

# Создаем матрицу
matrix = np.zeros((rows, cols))

for i in range(1, len(data_lines)):
parts = data_lines[i].split()
if len(parts) >= 3:
r, c = int(parts[0])-1, int(parts[1])-1
val = float(parts[2])
matrix[r, c] = val

return matrix

if __name__ == "__main__":
mat = np.array([
[1, 0, 3],
[0, 5, 0],
[7, 0, 9]
])

# Сохраняем
save_mtx(mat, "simple.mtx")

# Загружаем
loaded = load_mtx("simple.mtx")

print("Исходная матрица:")
print(mat)
print("\nЗагруженная матрица:")
print(loaded)

print("\nСовпадают?", np.allclose(mat, loaded))