From 87504cc001af6b2a694bdf17d9e22c65e9fc7891 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Mon, 8 Dec 2025 15:30:58 +0300 Subject: [PATCH] Control-work-No.2 --- .../Task_1/src/matrix_package/__init__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 294 bytes .../__pycache__/matrix.cpython-312.pyc | Bin 0 -> 3688 bytes .../Task_1/src/matrix_package/matrix.py | 56 ++++++++++++++ .../Task_1/src/test_matrix.py | 37 +++++++++ .../Control-work-No.2/Task_2/src/matrix.py | 41 ++++++++++ .../Control-work-No.2/Task_3/src/matrix.py | 70 ++++++++++++++++++ 7 files changed, 208 insertions(+) create mode 100644 Control-works/Control-work-No.2/Task_1/src/matrix_package/__init__.py create mode 100644 Control-works/Control-work-No.2/Task_1/src/matrix_package/__pycache__/__init__.cpython-312.pyc create mode 100644 Control-works/Control-work-No.2/Task_1/src/matrix_package/__pycache__/matrix.cpython-312.pyc create mode 100644 Control-works/Control-work-No.2/Task_1/src/matrix_package/matrix.py create mode 100644 Control-works/Control-work-No.2/Task_1/src/test_matrix.py create mode 100644 Control-works/Control-work-No.2/Task_2/src/matrix.py create mode 100644 Control-works/Control-work-No.2/Task_3/src/matrix.py 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 0000000000000000000000000000000000000000..d06f3e3221a0c5867103df088abfc3e9ce4bfacb GIT binary patch literal 294 zcmX@j%ge<80td`8jeyi+Fb7I7LFvz8K*n^26owSW9EM!RC`Lwx6sB~>D5gqgO_rC8 zKuJx;TWr3GB}JJPMa)31pC8B)?BtnSf{9L_~ z)S}$d3jMUqoYZ3djQreG{eYtU^rFPv+|0am{q)Qd{ea4njQqTKkX(6wQMSHweqKpY zevU4PQ;fpX^~={Y(ho^2&W<ATc>RF+Ej3K0Y%qvm`!Vub}c4hfQvNN@-52 iT@feHNg!Vo^8<+w%#4hTcNwG}a0_>6HL@461H}MUl2b?k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cb1f99d2341fc4cdd8aff4bac66d9534bea7575a GIT binary patch literal 3688 zcmbVOUrbxq89(R#vkf+28f=);a(#! zwWFxYgR?SWL{%R_upC9`4o$1}vS=?9khbh$+jq|Ob#02+ zmLvJ+bI$jj@1FC0-}#;I4>nr`g7&wsyTV@!2>pc&jK&o@2X8=U2{GvBNJ0;hgui5T z$tX%NUN&gxlYd+o9CSfv35C!ome438;fH9Hl^8%yVgY%H0~914&?E_fX2}F-NtnGB zO}G(=%i)<|;XBkO*$oT7gI`h0Nt{F?6%dFM32jOIWnm8>FRm|@OV|yXC0fO`3G{>+ zeo4%DIgJ;kKs=zakx*3Q!j))cVg{G!|KIkAL9fGlm_IOC1 zn40Oh9gc*Qjyti5P{)UIY)lSJOoXFj9b@5m$A^jdomf;Pvgw#S-q9b6#^qS#JQ*lu zqw~YD_V+qI3Mk{EuVaEbM!XjYjt9mgk~1Sa5Nkj#o21zdF{po*`m@6@Br<& z+-YvEVz>5`$}L`lu7!5ho6Dxfp)~g!%K@mNGPjfTpl<&cbe2%u2rx>byG8esReCer zI)LVxc{a$7fwfy#5lS&-D~;4Lmcf6?N;b&Qb#K8s7QO?Cd9)=N62v4+5&t)hSe7!Lb8U#8osLua!8qq#1$SSO{B>-qGJ-pfFwb*s*2H~V>1Yq`v4En zp@8a6tDP&|%iYgit%p48sQBL1n!$%G>hK_o;J2a!3y3FlQ?{AyWyxKP* z+YS8cfCYh42U}Qf@OKMewfQ@(Sq~50Y$w68>>ysC+3_dnyk>S>e9i1Q^}lAvEchN` z?k+~Z=XIhl+u?|^1Hg#0pacVvfGoR+fH+KsEumu~Juww2i!>eA5Z!wKCq~-WwIMwX zZ-$@0`$697&%OJ>y6lMCg@V8jAcHZw5vMmIUkL^Ra^Z#FL z3-=eCl>+J?!%2Mim>XY+OD#kL?pGN|~jcrD&W_P$+vT_(PiSV+9Ed(!@0 zSH1fFO3!l73)i^}-gP&s@s-4K;)UCr@$b~utGQ*!wd?DXYd1DLxt7k2 zsiz-re!S(|yuTI5UAUTSxtgoJ`q|JAEUJG8pzf_b7CGK5r>RQhxJ)mZdg@9a7c4$V zuzNy9&G0)I02qW~WQjae&_CKBDIf?bNKEL#^O9nc%;$IsV>D-mU{rG`fqutMV|wYm zm~y^VCw$XFciu zKb~&Pn0D&UEZX3-4QByr8(%5pu6)wignx22O0~e3`ngI^4s)cP{3wqg{X9^@h*Bu7 zp9<4cDa2Ue6qO)@`Xw9g!lwLQbr`jT8;Q$!sBm4ew&k6qSsBw5d;#JN}9_hFrt;5j^tt$<#fI%r`G7j zgPn{Zi9Gwnle8rn1R)c+A7v5-X@QEMpyB6*LO}x_075y|2I%O;3-CLTh>+yQ zFMzx7oCPXYN&!hq2k;;{=z}Eag-Obk;tA zak^E{LbrNzp?BMQ_NSAp=hp3OUZ`f;a?bXRx@UOP{mi%7uqA9wW-Z@&veuk$DCZp7 zwhsNdsyfZ?I^R(3pI=P(Lk(4bR-Ih+d~q5IC|A|@?v{)n3aGcwuiyObOunXfZD!T8 z;d{pZ{$i$1#S3oLx7e^s1Uv2)sFQ3CsFPe(duC*-$^267Ul?5NTKBAVuaB%<&N+P> z15dAQUV9eGcMjy713Bx!qyD{0RNJs;MK#WJ#jAY_viFgS%2lN_!ojmmjw_eU+4m~0 zbX8^h2!3PYVdk4Ig2UblQpQIE6CqL52w}&hsR-#?MR9T}5YZ)a6LTMvXP-lh%=> literal 0 HcmV?d00001 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))