diff --git a/Control-works/Control-work-No.2/Task_1/src/matrix_package/__init__.py b/Control-works/Control-work-No.2/Task_1/src/matrix_package/__init__.py new file mode 100644 index 0000000..79a831e --- /dev/null +++ b/Control-works/Control-work-No.2/Task_1/src/matrix_package/__init__.py @@ -0,0 +1,4 @@ +from .matrix import Matrix + +__all__ = ['Matrix'] + diff --git a/Control-works/Control-work-No.2/Task_1/src/matrix_package/__pycache__/__init__.cpython-312.pyc b/Control-works/Control-work-No.2/Task_1/src/matrix_package/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..d06f3e3 Binary files /dev/null and b/Control-works/Control-work-No.2/Task_1/src/matrix_package/__pycache__/__init__.cpython-312.pyc differ diff --git a/Control-works/Control-work-No.2/Task_1/src/matrix_package/__pycache__/matrix.cpython-312.pyc b/Control-works/Control-work-No.2/Task_1/src/matrix_package/__pycache__/matrix.cpython-312.pyc new file mode 100644 index 0000000..cb1f99d Binary files /dev/null and b/Control-works/Control-work-No.2/Task_1/src/matrix_package/__pycache__/matrix.cpython-312.pyc differ diff --git a/Control-works/Control-work-No.2/Task_1/src/matrix_package/matrix.py b/Control-works/Control-work-No.2/Task_1/src/matrix_package/matrix.py new file mode 100644 index 0000000..d892099 --- /dev/null +++ b/Control-works/Control-work-No.2/Task_1/src/matrix_package/matrix.py @@ -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 diff --git a/Control-works/Control-work-No.2/Task_1/src/test_matrix.py b/Control-works/Control-work-No.2/Task_1/src/test_matrix.py new file mode 100644 index 0000000..ae9b351 --- /dev/null +++ b/Control-works/Control-work-No.2/Task_1/src/test_matrix.py @@ -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() diff --git a/Control-works/Control-work-No.2/Task_2/src/matrix.py b/Control-works/Control-work-No.2/Task_2/src/matrix.py new file mode 100644 index 0000000..7123fa4 --- /dev/null +++ b/Control-works/Control-work-No.2/Task_2/src/matrix.py @@ -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) diff --git a/Control-works/Control-work-No.2/Task_3/src/matrix.py b/Control-works/Control-work-No.2/Task_3/src/matrix.py new file mode 100644 index 0000000..9a58058 --- /dev/null +++ b/Control-works/Control-work-No.2/Task_3/src/matrix.py @@ -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))