Untitled

 avatar
unknown
python
2 years ago
2.5 kB
5
Indexable
import sys
import os
import math


# Класс Matrix

class Matrix: 
    def __init__(self, matrix):
        # Инициализация свойств матрицы
        self.m = len(matrix)
        self.n = len(matrix[0])
        self.matrix = matrix

    # Вывод матрицы
    def __str__(self):
        nl = '\n' # Обход ограничения f-строк на использование обратных слешей
        return f"{nl.join([' '.join([str(j).rjust(3, ' ') for j in i]) for i in self.matrix])}"

    # Определяем сеттер
    def __setitem__(self, key, value):
        self.matrix[key] = value
    
    # Определяем геттер
    def __getitem__(self, key):
        return self.matrix[key]
    
    def det(self):
        res, koef = 1, 1
        for i in range(self.n):
            # выбираем опорный элемент
            j = max(range(i,self.n), key=lambda k: abs(self[k][i]))
            if i != j:
                self[i],self[j] = self[j],self[i]
                res *= -1
            # убеждаемся, что матрица не вырожденная
            if self[i][i] == 0:
                return 0
            res *= self[i][i]
            # "обнуляем" элементы в текущем столбце
            for j in range(i+1,self.n):
                gcd = math.gcd(self[i][i], self[j][i])
                b1 =self[j][i]//gcd
                b2 = self[i][i]//gcd
                koef *= b2
                self[j] = [b2*self[j][k]-b1*self[i][k] for k in range(self.n)]
                print(f'{b2}*({j+1}) – {b1}*({i+1})')
                print(self)
        return res//koef


# Функция для считывания данных
def read_file():
    if len(sys.argv) > 1 and os.path.exists(sys.argv[1]):
        with open(sys.argv[1]) as f:
            return f.read()
    else:
        while True:
            print('Передайте название файла аргументом в командную строку: ', end='')
            file_name = input()
            if os.path.exists(file_name):
                with open(file_name) as f:
                    try:
                        return [[int(num) for num in st.strip().split(' ')] for st in f.readlines()[1::]]
                    except:
                        print("Содержимое файла невалидно")


matrix = Matrix(read_file())
print(matrix)
print(f"Определитель равен: {matrix.det()}")
Editor is loading...