Как вывести матрицу в python в виде таблицы
Перейти к содержимому

Как вывести матрицу в python в виде таблицы

  • автор:

Вывести элементы списка матрицей по 4 елемента

Столкнулся с небольшой проблемой. Нужно вывести элементы списка матрицей (по 4 элемента в строчке), в независимости от того, сколько их нужно вывести(хоть 1, хоть 10000). Вот мой нынешний код:

from tabulate import tabulate def numbers(n): print("Варіант виводу:\n1-списком\n2-матрицею\n3-к-ть") v=int(input("")) num=[] matr_num=[] for i in range(1,n+1): num.append(i) if v==1: print(num) elif v==2: for i in num: matr_num.append([num[i],num[i+1],num[i+2],num[i+3]]) print(tabulate(list(zip(matr_num)),tablefmt='fancy_grid')) elif v==3: print(len(num)) n=int(input("n=")) numbers(n) 

Отслеживать

149k 12 12 золотых знаков 59 59 серебряных знаков 133 133 бронзовых знака

задан 10 мар 2021 в 8:21

33 1 1 серебряный знак 4 4 бронзовых знака

Как создать матрицу в Python: инструкция

Матрицы являются одним из основных объектов в математике. Они используются для представления и манипулирования данными в виде таблицы, состоящей из строк и столбцов. Их используют для решения систем линейных уравнений, определения матричных действий, преобразования координат и многого другое.

В этой статье мы опишем несколько способов создать матрицу в Python. И дополнительно рассмотрим некоторые основные операции, такие как сложение, умножение и определение обратной матрицы.

Что такое матрица

Матрица — это таблица из чисел, которая используется в математике и инженерных науках для представления данных. Матрицы имеют форму таблицы, состоящей из строк и столбцов. Каждый элемент имеет свой уникальный индекс, обозначающий строку и столбец, в котором он находится. Например, матрица размером 3×3 будет иметь 3 строки и 3 столбца, и каждый элемент будет иметь индекс вида (i, j), где i — номер строки, а j — номер столбца.

Создание матрицы

В Python существует несколько способов создания матрицы. Ниже приведены некоторые из них:

  • С помощью списков. Можно создать матрицу, используя вложенные списки. Каждый вложенный список будет соответствовать одной строке. Так можно создать квадратную матрицу Python :
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • С помощью NumPy. NumPy — это библиотека для математических вычислений и обработки данных. В ней есть класс Array, который можно использовать для создания матрицы:
import numpy as np 

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

Если вам нужно производить стандартные математические операции с матрицами, то стоит использовать NumPy. Его проще использовать и все операции уже реализованы в библиотеке. А если вы хотите самостоятельно создавать методы, например, в образовательных целях, или же планируете совершать нестандартные манипуляции, то используйте вложенные списки.

Теперь рассмотрим матричные операции и поработаем с ними с помощью вложенных списков и NumPy.

Матричные операции

Вот список основных манипуляций:

  • Сложение. Две матрицы можно сложить, если их размеры совпадают. Каждый элемент итоговой матрицы будет равен сумме соответствующих элементов исходных матриц.
  • Вычитание. Одну матрицу можно вычесть из другой, если их размеры совпадают. Каждый элемент итоговой матрицы будет равен разности соответствующих элементов исходных матриц.
  • Умножение начисло. Каждый элемент итоговой матрицы будет равен произведению соответствующего элемента исходной матрицы на число.
  • Произведение матриц. Матрицы можно перемножить, если число столбцов первой матрицы равно числу строк второй матрицы. В результате получится новая матрица с размером, соответствующим числу строк первой матрицы и числу столбцов второй матрицы. Более подробно эту операцию мы разберем чуть дальше.
  • Транспонирование матрицы. Транспонирование — это операция, в которой строки и столбцы меняются местами. Т.е. первый столбец становится первой строкой, второй столбец — второй строкой и так далее.
  • Нахождение обратной матрицы. Матрица B будет являться обратной матрицей для матрицы A, если результатом операции A*B является единичная матрица.

Сложение

Важно не забывать, что при сложении двух матриц их размеры должны совпадать.

Вот пример сложения с помощью вложенных списков и циклов:

matrix1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
matrix2 = [[9, 8, 7], [6, 5, 4], [3, 2, 1]]
result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

for i in range(len(matrix1)):
for j in range(len(matrix1[0])):
result[i][j] = matrix1[i][j] + matrix2[i][j]

print(result)
[[10, 10, 10], [10, 10, 10], [10, 10, 10]]

Вот аналогичное сложение с помощью метода add() из библиотеки NumPy:

import numpy as np 

matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix2 = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

result = np.add(matrix1, matrix2)

print(result)
[[10 10 10] 
[10 10 10]
[10 10 10]]

Вычитание

В Python можно выполнять вычитание матриц с помощью цикла или метода subtract() из библиотеки NumPy. При вычитании размеры должны совпадать.

Вычитание с помощью цикла:

matrix1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
matrix2 = [[9, 8, 7], [6, 5, 4], [3, 2, 1]]
result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

for i in range(len(matrix1)):
for j in range(len(matrix1[0])):
result[i][j] = matrix1[i][j] - matrix2[i][j]

print(result)
[[-8, -6, -4], [-2, 0, 2], [4, 6, 8]]

Вычитание с помощью метода subtract() из библиотеки NumPy:

import numpy as np 

matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix2 = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

result = np.subtract(matrix1, matrix2)

print(result)
[[-8 -6 -4] 
[-2 0 2]
[ 4 6 8]]

Умножение на число

В Python умножение матрицы на число можно реализовать с помощью цикла или воспользоваться методом dot() из библиотеки NumPy.

При умножении матрицы на число, каждый элемент умножается на это число.

Умножение с помощью цикла:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
scalar = 2
result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

for i in range(len(matrix)):
for j in range(len(matrix[0])):
result[i][j] = matrix[i][j] * scalar

print(result)
[[2, 4, 6], [8, 10, 12], [14, 16, 18]]

Вот пример работы метода dot() из библиотеки NumPy с теми же вводными:

import numpy as np 

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
scalar = 2

result = np.dot(matrix, scalar)

print(result)
[[ 2 4 6] 
[ 8 10 12]
[14 16 18]]

Также вместо метода dot() можно использовать знак операции умножения * :

import numpy as np 

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
scalar = 2

result = matrix * scalar

print(result)
[[ 2 4 6] 
[ 8 10 12]
[14 16 18]]

В большинстве случаев метод dot() работает быстрее вручную реализованных циклов.

Произведение матриц

Произведение — это операция, в результате которой получается новая матрица с числом строк первой матрицы и числом столбцов второй. При матричном умножении, число столбцов первой матрицы должно совпадать с числом строк второй. Каждый элемент новой матрицы — это сумма произведения элементов строки первой матрицы и элементов столбцов второй матрицы, как на картинке ниже:

Как и прежде, реализуем произведение с помощью циклов и NumPy.

Умножение, реализованное на циклах, может иметь такой вид:

matrix1 = [[1, 2], [3, 4]] 
matrix2 = [[5, 6], [7, 8]]
result = [[0, 0], [0, 0]]

for i in range(len(matrix1)):
for j in range(len(matrix2[0])):
for k in range(len(matrix2)): result[i][j] += matrix1[i][k] * matrix2[k][j]

print(result)
[[19, 22], [43, 50]]

В NumPy для матричного умножения используется метода dot() :

import numpy as np 

matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])

result = np.dot(matrix1, matrix2)

print(result)
[[19 22] 
[43 50]]

Аналогично методу dot() работает операция @ :

import numpy as np 

matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])

result = matrix1 @ matrix2

print(result)
[[19 22] 
[43 50]]

Использование метода dot() или оператора @ даёт более быстрый, по сравнению с использованием вручную реализованных циклов, результат.

Не забывайте, что произведение является некоммутативной операцией, то есть порядок умножения матриц имеет значение и результат будет разным, если их переставить местами.

Транспонирование

Транспонирование — это операция, в результате которой строки исходной матрицы становятся столбцами новой матрицы, а столбцы — строками.

В Python можно выполнить транспонирование с помощью свойства T или метода transpose() из библиотеки NumPy .

Пример транспонирования с использованием свойства T :

import numpy as np 
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

result = matrix.T

print(result)
[[1 4 7] 
[2 5 8]
[3 6 9]]

И пример транспонирования с использованием метода transpose() :

import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

result = np.transpose(matrix)

print(result)
[[1 4 7] 
[2 5 8]
[3 6 9]]

В обоих случаях результат одинаковый.

С помощью цикла транспонирование можно реализовать следующим образом:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

for i in range(len(matrix)):
for j in range(len(matrix[0])):
result[j][i] = matrix[i][j]

print(result)
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

Этот метод может быть медленным и неэффективным для больших матриц, поэтому для более быстрого и эффективного решения рекомендуется использовать NumPy.

Нахождение обратной матрицы

Обратная матрица — это матрица, которая при умножении на исходную матрицу в результате дает единичную матрицу (с единицами на диагонали и нулями в остальных ячейках).

В Python можно найти обратную матрицу с помощью метода inv() из библиотеки NumPy.

import numpy as np 

matrix = np.array([[1, 2], [3, 4]])

result = np.linalg.inv(matrix)

print(result)
[[-2. 1. ] 
[ 1.5 -0.5]]

Если матрица не имеет обратной матрицы, то метод inv() вызовет исключение LinAlgError: Singular matrix .

Чтобы проверить, имеет ли матрица обратную, используйте метод det() из библиотеки NumPy, который возвращает определитель матрицы. Если определитель равен нулю, то матрица вырожденная и она не имеет обратной матрицы:

import numpy as np

matrix = np.array([[1, 2], [3, 4]])
determinant = np.linalg.det(matrix)

if determinant == 0:
print("The matrix does not have an inverse.")
else:
result = np.linalg.inv(matrix)
print(result)

Нахождение обратной матрицы с помощью циклов может быть достаточно сложным и трудоемким процессом, особенно для больших матриц. Поэтому рекомендуем использовать NumPy.

Заключение

Матрицы являются важной концепцией в линейной алгебре и часто используются в различных областях, таких как искусственный интеллект, графика и оптимизация. В Python представлено множество инструментов для работы с матрицами, включая библиотеку NumPy. Понимание матриц и их операций может быть полезным для решения множества практических задач в различных областях.

Как вывести матрицу в python в виде таблицы

Часто в задачах приходится хранить прямоугольные таблицы с данными. Такие таблицы называются матрицами или двумерными массивами. В языке программирования Питон таблицу можно представить в виде списка строк, каждый элемент которого является в свою очередь списком, например, чисел. Например, приведём программу, в которой создаётся числовая таблица из двух строк и трех столбцов, с которой производятся различные действия.

a = [[1, 2, 3], [4, 5, 6]] print(a[0]) print(a[1]) b = a[0] print(b) print(a[0][2]) a[0][1] = 7 print(a) print(b) b[2] = 9 print(a[0]) print(b)

Здесь первая строка списка a[0] является списком из чисел [1, 2, 3] . То есть a[0][0] == 1 , значение a[0][1] == 2 , a[0][2] == 3 , a[1][0] == 4 , a[1][1] == 5 , a[1][2] == 6 .

Для обработки и вывода списка, как правило, используют два вложенных цикла. Первый цикл перебирает номер строки, второй цикл бежит по элементам внутри строки. Например, вывести двумерный числовой список на экран построчно, разделяя числа пробелами внутри одной строки, можно так:

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] for i in range(len(a)): for j in range(len(a[i])): print(a[i][j], end=' ') print()

Однажды мы уже пытались объяснить, что переменная цикла for в Питоне может перебирать не только диапазон, создаваемый с помощью функции range() , но и вообще перебирать любые элементы любой последовательности. Последовательностями в Питоне являются списки, строки, а также некоторые другие объекты, с которыми мы пока не встречались. Продемонстрируем, как выводить двумерный массив, используя это удобное свойство цикла for :

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] for row in a: for elem in row: print(elem, end=' ') print()

Естественно, для вывода одной строки можно воспользоваться методом join() :

for row in a: print(' '.join([str(elem) for elem in row]))

Используем два вложенных цикла для подсчета суммы всех чисел в списке:

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] s = 0 for i in range(len(a)): for j in range(len(a[i])): s += a[i][j] print(s)

Или то же самое с циклом не по индексу, а по значениям строк:

a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] s = 0 for row in a: for elem in row: s += elem print(s)

2. Создание вложенных списков

Пусть даны два числа: количество строк n и количество столбцов m . Необходимо создать список размером n × m , заполненный нулями.

Очевидное решение оказывается неверным:

a = [[0] * m] * n

В этом легко убедиться, если присвоить элементу a[0][0] значение 5 , а потом вывести значение другого элемента a[1][0] — оно тоже будет равно 5. Дело в том, что [0] * m возвращает ccылку на список из m нулей. Но последующее повторение этого элемента создает список из n элементов, которые являются ссылкой на один и тот же список (точно так же, как выполнение операции b = a для списков не создает новый список), поэтому все строки результирующего списка на самом деле являются одной и той же строкой.

В визуализаторе обратите внимание на номер id у списков. Если у двух списков id совпадает, то это на самом деле один и тот же список в памяти.

n = 3 m = 4 a = [[0] * m] * n a[0][0] = 5 print(a[1][0])

Таким образом, двумерный список нельзя создавать при помощи операции повторения одной строки. Что же делать?

Первый способ: сначала создадим список из n элементов (для начала просто из n нулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:

n = 3 m = 4 a = [0] * n for i in range(n): a[i] = [0] * m

Другой (но похожий) способ: создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:

n = 3 m = 4 a = [] for i in range(n): a.append([0] * m)

Но еще проще воспользоваться генератором: создать список из n элементов, каждый из которых будет списком, состоящих из m нулей:

n = 3 m = 4 a = [[0] * m for i in range(n)]

В этом случае каждый элемент создается независимо от остальных (заново конструируется список [0] * m для заполнения очередного элемента списка), а не копируются ссылки на один и тот же список.

3. Ввод двумерного массива

Пусть программа получает на вход двумерный массив в виде n строк, каждая из которых содержит m чисел, разделенных пробелами. Как их считать? Например, так:

3 1 2 3 4 5 6 7 8 9
# в первой строке ввода идёт количество строк массива n = int(input()) a = [] for i in range(n): a.append([int(j) for j in input().split()])

Или, без использования сложных вложенных вызовов функций:

3 1 2 3 4 5 6 7 8 9
# в первой строке ввода идёт количество строк массива n = int(input()) a = [] for i in range(n): row = input().split() for i in range(len(row)): row[i] = int(row[i]) a.append(row)

Можно сделать то же самое и при помощи генератора:

3 1 2 3 4 5 6 7 8 9
# в первой строке ввода идёт количество строк массива n = int(input()) a = [[int(j) for j in input().split()] for i in range(n)]

4. Пример обработки двумерного массива

Пусть дан квадратный массив из n строк и n столбцов. Необходимо элементам, находящимся на главной диагонали, проходящей из левого верхнего угла в правый нижний (то есть тем элементам a[i][j] , для которых i==j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, находящимся ниже главной диагонали – значение 2. То есть необходимо получить такой массив (пример для n==4 ):

1 0 0 0 2 1 0 0 2 2 1 0 2 2 2 1

Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы a[i][j] , для которых ij . Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j] . Получаем следующий алгоритм:

n = 4 a = [[0] * n for i in range(n)] for i in range(n): for j in range(n): if i < j: a[i][j] = 0 elif i >j: a[i][j] = 2 else: a[i][j] = 1 for row in a: print(' '.join([str(elem) for elem in row]))

Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.

Сначала заполним главную диагональ, для чего нам понадобится один цикл:

for i in range(n): a[i][i] = 1

Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам a[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:

for i in range(n): for j in range(i + 1, n): a[i][j] = 0

Аналогично присваиваем значение 2 элементам a[i][j] для j = 0 , . i-1 :

for i in range(n): for j in range(0, i): a[i][j] = 2

Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:

n = 4 a = [[0] * n for i in range(n)] for i in range(n): for j in range(0, i): a[i][j] = 2 a[i][i] = 1 for j in range(i + 1, n): a[i][j] = 0 for row in a: print(' '.join([str(elem) for elem in row]))

А вот такое решение использует операцию повторения списков для построения очередной строки списка. i -я строка списка состоит из i чисел 2 , затем идет одно число 1 , затем идет n-i-1 число 0 :

n = 4 a = [0] * n for i in range(n): a[i] = [2] * i + [1] + [0] * (n - i - 1) for row in a: print(' '.join([str(elem) for elem in row]))

А можно заменить цикл на генератор:

n = 4 a = [0] * n a = [[2] * i + [1] + [0] * (n - i - 1) for i in range(n)] for row in a: print(' '.join([str(elem) for elem in row]))

5. Вложенные генераторы двумерных массивов

Для создания двумерных массивов можно использовать вложенные генераторы, разместив генератор списка, являющегося строкой, внутри генератора всех строк. Напомним, что сделать список из n строк и m столбцов можно при помощи генератора, создающего список из n элементов, каждый элемент которого является списком из m нулей:

[[0] * m for i in range(n)]

Но при этом внутренний список также можно создать при помощи, например, такого генератора: [0 for j in range(m)] . Вложив один генератор в другой, получим вложенные генераторы:

[[0 for j in range(m)] for i in range(n)]

Но если число 0 заменить на некоторое выражение, зависящее от i (номер строки) и j (номер столбца), то можно получить список, заполненный по некоторой формуле.

Например, пусть нужно задать следующий массив (для удобства добавлены дополнительные пробелы между элементами):

0 0 0 0 0 0 0 1 2 3 4 5 0 2 4 6 8 10 0 3 6 9 12 15 0 4 8 12 16 20

В этом массиве n = 5 строк, m = 6 столбцов, и элемент в строке i и столбце j вычисляется по формуле: a[i][j] = i * j .

Для создания такого массива можно использовать генератор:

[[i * j for j in range(m)] for i in range(n)]

Работа с матрицами в python

Привет, Хабр! Я недавно начал свой путь в data science и хочу поделиться свои опытом в написание алгоритмов для работы с матрицами, я планирую активно пополнять свой репозиторий новыми функциями (понимаю что можно все сделать с нампаем).

Транспонирование матрицы

Во-первых, что такое транспонирование, это операция в последствие которой строки и столбцы меняются местами.

Простейший пример транспонирование матрицы

На фото наглядный пример поворота, это довольна простая операция, которую я реализовал в два цикла.

def transpose_matrix(matrix: list[list]) -> list[list]: transposed_matrix = [[0 for i in range(len(matrix))] for i in range(len(matrix[0]))] for i in range(len(matrix)): for j in range(len(matrix[0])): transposed_matrix[j][i] = matrix[i][j] return transposed_matrix

Матрицы представляют вложенными списками, поэтому функция принимает список в списке. Переменная transposed_matrix хранит в себе нулевую матрицу с размерами идентичной нашей только с поворотом в 90 градусов, затем происходит двойная итерация в которой элементы меняются местами, в результате выходит поворот.

Ранг матрицы

Ранг матрицы — наивысший из порядков всевозможных ненулевых миноров этой матрицы.

Нахождение ранга матрицы

def rank_of_matrix(matrix: list[list]) -> int: rank = min(len(matrix), len(matrix[0])) row_index = 0 for i in range(len(matrix[0])): found_nonzero = False for j in range(row_index, len(matrix)): if matrix[j][i] != 0: found_nonzero = True matrix[row_index], matrix[j] = matrix[j], matrix[row_index] break if found_nonzero: for j in range(row_index + 1, len(matrix)): factor = matrix[j][i] / matrix[row_index][i] for k in range(i, len(matrix[0])): matrix[j][k] -= matrix[row_index][k] * factor row_index += 1 return rank

В самом начале в переменная rank инициализируется минимальным значением между количеством строк и количеством столбцов в матрице. Это определяется тем, что ранг матрицы не может быть больше, чем количество строк или столбцов, row_index равна нулю, так как это будет индексом строки, с котором мы будем работать на каждом шаге. Так же проходимся двумя циклами и ищем первый ненулевой элемент в текущем столбце. Если такой элемент найден, он меняется местами. Это делается для того, чтобы разместить ненулевой элемент на позиции ( row_index, i ) . Если найден ненулевой элемент в текущем столбце на позиции ( row_index, i ) , производится процесс приведения матрицы к ступенчатому виду. Для этого вычисляется коэффициент factor, равный matrix[j][i] / matrix[row_index][i], и затем вычитается matrix[row_index][k] * factor из всех элементов строки j, начиная с позиции i. Это приводит к обнулению всех элементов ниже matrix[row_index][i] в столбце i. Увеличиваем row_index на 1, чтобы перейти к следующей строке и продолжить процесс приведения к ступенчатому виду. По окончании алгоритма возвращается rank, которая представляет собой максимальное количество линейно независимых строк или столбцов в матрице.

Инверсия матрицы

Обратная матрица — это матрица, которая умножается на исходную матрицу таким образом, что их произведение дает единичную матрицу. Другими словами, если у нас есть матрица A и ее обратная матрица обозначается как A^-1.

Сравнение начальной и обратной матрицы

def inverse_matrix(matrix: list[list]) -> list[list]: augmented_matrix = [ [ matrix[i][j] if j < len(matrix) else int(i == j - len(matrix)) for j in range(2 * len(matrix)) ] for i in range(len(matrix)) ] for i in range(len(matrix)): pivot = augmented_matrix[i][i] if pivot == 0: raise ValueError("Matrix is not invertible") for j in range(2 * len(matrix)): augmented_matrix[i][j] /= pivot for j in range(len(matrix)): if i != j: scalar = augmented_matrix[j][i] for k in range(2 * len(matrix)): augmented_matrix[j][k] -= scalar * augmented_matrix[i][k] inverse = [ [augmented_matrix[i][j] for j in range(len(matrix), 2 * len(matrix))] for i in range(len(matrix)) ] return inverse

Переменная augmented_matrix представляет собой расширенную матрицу, добавив единичную матрицу справа. Происходит итерация, получаем значение pivot, которое является текущим диагональным элементом. Если pivot равна 0, вызывается исключение, так как матрица не обратима. Далее делаем нормирование строки, делим все элементы строки на pivot. Это делается для того, чтобы текущий диагональный элемент стал равным 1. Внутренний цикл итерируется по всем столбцам расширенной матрицы. Вычитаем из текущей строки другие строки, умноженные на значение элемента scalar. После завершения внутреннего цикла, матрица будет приведена к верхнетреугольному виду. Создается матрица inverse, которая содержит элементы справа от вертикальной черты в augmented_matrix. Возвращается матрица inverse, которая представляет собой обратную матрицу исходной матрицы.

Заключение

На этом все, это моя первая статья в целом, не знаю что с этого выйдет, но очень хотелось написать и поделиться реализацией. Я привел три алгоритма по обработке матриц, в моем репозитории вы можете посмотреть другие. Пока что я только пробую себя в науке о данных, в дальнейшем хочу производить различный анализы и делиться ими на сайте.

Спасибо за выделенное время! Надеюсь было интересно, пишите свои мысли, критикуйте, буду рад исправиться и писать лучшие статьи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *