Что такое матрица в программировании
Введение в матрицы для начинающих
Дата публикации Sep 19, 2019
Матрицы являются строительными блоками науки о данных. Они появляются в различных аватарах на разных языках. От массива в Python до массивов данных в R и матриц в MATLAB.
Матрица в своей основной форме представляет собой набор чисел, расположенных в прямоугольной или массивной форме. Это может представлять изображение, или сеть, или даже абстрактную структуру.
Матрицы, множественное число для матрицы, на удивление встречаются чаще, чем вы думаете.
Все наши мемы, созданные с помощью Adobe Photoshop, используют матрицы для обработки линейных преобразований для визуализации изображений.квадратная матрицаможет представлять линейное преобразование геометрического объекта.
Например, в декартовой плоскости X-Y матрица
используется для создания отражения объекта по вертикальной оси Y. В видеоигре это отразит перевернутое изображение убийцы в кровавом пруду. Если бы в видеоигре были изогнутые отражающие поверхности, такие как комната зеркал, матрица была бы более сложной, чтобы растянуть или уменьшить отражение.
В прикладной физике матрицы используются для изучения электрических цепей, квантовой механики и оптики. Аэрокосмическая инженерия, химическая инженерия и т. Д. Требуют идеально откалиброванных вычислений, полученных в результате матричных преобразований. В больницах, медицинских изображениях, компьютерной томографии и МРТ для получения результатов используются матрицы.
В программировании матрицы и обратные матрицы используются для кодирования и шифрования сообщений. В робототехнике и автоматизации матрицы являются основными компонентами движений робота. Входные данные для управления роботами получены на основе расчетов с использованием матриц.
На что они похожи?
Условно число строк в матрице обозначаетсями количество столбцов поN, Так как площадь прямоугольникаростИксширина,мы обозначаем размер матрицымИксп.Таким образом, матрица должна была быть названаA,это будет записано в нотации как
Здесь m = 3 и n = 4. Таким образом, в матрице А 12 элементов. Квадратная матрица имеетт = п,
Матрица с одной строкой называетсяматрица строки матрица с одним столбцом называетсяматрица столбцов.
Что мы можем с ними сделать?
Матрицы так же, как числа могут быть добавлены, вычтены и умножены. Разделение немного нюанс. Не все матрицы могут быть разделены.
Существуют определенные правила даже для сложения, вычитания и умножения.
Дополнение матриц
Сложение двух матриц А (м * п) а также B (м * п) дает матрицу С (м * п). Элементы C являются суммой соответствующих элементов в A и B
Вычитание работает аналогично.
Здесь следует отметить, что вы можете только добавлять / вычитать матрицы с одинаковым количеством строк и столбцов, т.е.тот же порядок (порядок = строки х столбцы)
Указывает на заметку
Умножение хоть немного сложнее
Умножение матриц
Умножение двух матриц A (м * п) а также В (п*п) дает матрицу С (м * р). Обратите внимание, что для умножения вам не нужно, чтобы строки / столбцы A и B были одинаковыми. Вам нужно только
Чтобы вычислить верхний левый элемент полученной матрицы C, умножьте элементы 1-й строки A на 1-й столбец B и сложите их
Указывает на заметку
В следующем издании этой статьи мы увидим больше операций, которые могут быть выполнены над матрицами, например, Инверсия матрицы, определитель матрицы, сопряжение матрицы и т. Д.
Мы также увидим, как эти матрицы действительно помогают в областинейронные сетии обработка изображений.
Матрицы имеют огромное значение почти во всех алгоритмах машинного обучения изКНН(Алгоритм ближайшего соседа) вплоть доСлучайные Леса,
Матрица (программирование)
Массив (в некоторых языках программирования также таблица, ряд, матрица, вектор) — структура данных, хранящая набор значений (элементов массива), идентифицируемых по индексу или набору индексов, принимающих целые (или приводимые к целым) значения из некоторого заданного непрерывного диапазона. Одномерный массив можно рассматривать как реализацию абстрактного типа данных — вектор.
В простейшем случае массив имеет константную длину по всем размерностям и может хранить данные только одного, заданного при описании, типа. Ряд языков поддерживает также динамические массивы, длина которых может изменяться по ходу работы программы, и гетерогенные массивы, которые могут в разных элементах хранить данные различных типов.
Содержание
Общее описание
Массив — упорядоченный набор элементов, каждый из которых хранит одно значение, идентифицируемое с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа, а в качестве индексов выступают целые числа.
Количество используемых индексов массива может быть различным: массивы с одним индексом называют одномерными, с двумя — двумерными, и т. д. Одномерный массив — нестрого соответствует вектору в математике; двумерный («строка», «столбец»)— матрице. Чаще всего применяются массивы с одним или двумя индексами; реже — с тремя; ещё большее количество индексов — встречается крайне редко.
Пример фиксированного массива на языке Паскаль
Пример двумерного массива на JavaScript
Поддержка индексных массивов (свой синтаксис объявления, функции для работы с элементами и т. д.) есть в большинстве высокоуровневых языков программирования. Максимально допустимая размерность массива, типы и диапазоны значений индексов, ограничения на типы элементов определяются языком программирования и (или) конкретным транслятором.
В языках программирования, допускающих объявления программистом собственных типов, как правило, существует возможность создания типа «массив». В определении такого типа задаются типы и/или диапазоны значений каждого из индексов и тип элементов массива. Объявленный тип в дальнейшем может использоваться для определения переменных, формальных параметров и возвращаемых значений функций. Некоторые языки поддерживают для переменных-массивов операции присваивания (когда одной операцией всем элементам массива присваиваются значения соответствующих элементов другого массива).
Объявление типа «массив» в языке Паскаль
Специфические типы массивов
Динамические массивы
Динамическими называются массивы, размер которых может изменяться во время выполнения программы. Обычные (не динамические) массивы называют ещё фиксированными или статическими.
Динамические массивы могут реализовываться как на уровне языка программирования, так и на уровне системных библиотек. Во втором случае динамический массив представляет собой объект стандартной библиотеки, и все операции с ним реализуются в рамках той же библиотеки. Так или иначе, поддержка динамических массивов предполагает наличие следующих возможностей:
Ниже приведён пример конструкций для работы с динамическими массивами на Delphi.
Гетерогенные массивы
Гетерогенным называется массив, в разные элементы которого могут быть непосредственно записаны значения, относящиеся к различным типам данных. Массив, хранящий указатели на значения различных типов, не является гетерогенным, так как собственно хранящиеся в массиве данные относятся к единственному типу — типу «указатель». Гетерогенные массивы удобны как универсальная структура для хранения наборов данных произвольных типов. Реализация гетерогенности требует усложнения механизма поддержки массивов в трансляторе языка.
Реализация
Типовым способом реализации статического гомогенного (хранящего данные одного типа) массива является следующий:
Таким образом, адрес элемента с заданным набором индексов вычисляется так, что время доступа ко всем элементам массива одинаково. (Здесь одинаковость времени доступа следует понимать как отсутствие теоретической зависимости времени доступа от положения элемента и размера массива. В действительности особенности конкретной вычислительной платформы могут дать определённый разброс времени доступа. Например, CAS-латентность ОЗУ приводит к увеличению времени доступа к данным, расположенным в другой колонке (странице) ОЗУ, по отношению к предыдущим считанным данным. В практике высокоуровневого программирования такими тонкостями, за редчайшими исключениями, пренебрегают.)
Первый элемент массива, в зависимости от языка программирования, может иметь различный индекс. Различают три основных разновидности массивов: с отсчетом от нуля (zero-based), с отсчетом от единицы (one-based) и с отсчетом от специфического значения заданного программистом (n-based). Отсчет индекса элемента массивов с нуля более характерен для низкоуровневых языков программирования, хотя встречается и в языках высокого уровня, например, в том же Си. В ряде языков (Паскаль, Ада, Модула-2) диапазон индексов может определяться как произвольный диапазон значений любого типа данных, приводимого к целому, то есть целых чисел, символов, перечислений, даже логического типа (в последнем случае массив имеет два элемента, индексируемых значениями «Истина» и «Ложь»).
Обычным способом реализации гетерогенных массивов является отдельное хранение самих значений элементов и размещение в блоке памяти массива (организованного как обычный гомогенный массив, описанный выше) указателей на эти элементы. Поскольку указатели на значения любых типов, как правило, имеют один и тот же размер, удаётся сохранить простоту вычисления адреса, хотя возникают дополнительные накладные расходы на размещение значений элементов и обращение к ним.
Для динамических массивов может использоваться тот же механизм размещения, что и для статических, но с выделением некоторого объёма дополнительной памяти для расширения и добавлении механизмов изменения размера и перемещения содержимого массива в памяти.
Также динамические и гетерогенные массивы могут реализовываться путём использования принципиально иных методов хранения значений в памяти, например, одно- или двухсвязных списков. Такие реализации могут быть более гибкими, но требуют, как правило, дополнительных накладных расходов. Кроме того, в них обычно не удаётся выдержать требование константного времени доступа к элементу.
Линейная алгебра — программируем с NumPy
Линейная алгебра с нуля — матрицы
Сложно дать точное определение понятию «матрица». Тут ситуация такая же, как и с понятием «множество» в той самой теории множеств. Мы ограничимся тем, что матрица — набор элементов, представляющий собой таблицу, которая имеет столбцы и строки.
В математике обычно матрица записывается следующим образом:
Как правило, матрицы обозначаются заглавными буквами, а i и j — размерность матрицы (кол-во строк и кол-во столбцов соответственно). К примеру, определим матрицу размеров 3 на 2.
Элементы матрицы обычно обозначаются как , т. е. элемент, который находится на пересечении i-ой строки и j-ого столбца.
Теперь рассмотрим несколько видов матриц.
Квадратной матрицей называется матрица, в которой кол-во строк и кол-во столбцов равны. Определим матрицу 3 на 3:
Нулевой матрицей называется матрица, все элементы которой равны 0. Выражаясь математическим языком:
Единичной матрицей является матрица, у которой все элементы вне главной диагонали равны 0, а элементы на главной диагонали равны 1. Такая матрица является квадратной. К примеру, определим единичную матрицу размером 3 на 3:
Единичная матрица является подвидом диагональной матрицы — матрицы, у которой все элементы вне главной диагонали равны 0, а остальные имеют произвольное значение.
Треугольная матрица — матрица, все элементы выше или ниже главной диагонали равны 0. Выделяют два вида треугольных матриц — верхняя треугольная матрица:
и нижняя треугольная матрица:
Теперь перейдём к операциям над матрицами.
Сложение, вычитание, деление и умножение матриц
С операциями сложения, вычитания и деления всё просто — эти операции выполняются поэлементно. К примеру:
Однако, линейная алгебра располагает матричное умножение иным способом: результатом умножения матрицы и матрицы будет матрица . Очень важно, чтобы кол-во столбцов у матрицы А совпадало с кол-вом строк матрицы В.
Умножение воспроизводится следующим образом: элемент матрицы, которую мы получаем в итоге, равен скалярному произведению i-ой строки матрицы А и j-ого столбца матрицы В.
Первым элементом первой строки результирующей матрицы будет скалярное произведение первой строки матрицы А и первого столбца матрицы В, т.е. .
Вторым элементом второй строки будет скалярное произведение второй строки матрицы А и второго столбца матрицы В, т.е. .
Далее по аналогии мы получаем результат:
Теперь, когда мы изучили главную трудность на пути изучения матриц, перейдём к транспонированию матриц.
Транспонирование
Транспонирование матрицы — операция «переворачивания», которая заключается в одном очень простом правиле — строки матрицы становятся столбцами, а столбцы матрицы становятся строками.
Транспонированная матрица от матрицы обозначается как , и если А имеет форму , то будет иметь размер . Разберём на практическом примере:
Далее проследуем к понятию определителя матрицы.
Определитель матрицы
Определитель матрицы — скалярное значение, которое существует только у квадратной матрицы.
Если вдаваться в определения, то определителем матрицы называется сумма всех возможных произведений элементов матрицы с разных строк и с разных столбцов со знаком , где — перестановка, которая переводит номера строчек в номера столбцов. Звучит не очень, правда? Определение запутанное, однако по нему определитель матрицы никто не рассчитывает. Существует несколько методов, о которых мы поговорим в следующей статье, так как статья растянется в 3 раза и потеряет нить повествования.
Мы разберем два случая — определитель матрицы размером и матрицы размером . Очевидно, что для матрицы из одного элемента определитель такой матрицы равен самому элементу.
Для матрицы размером определитель равен разности произведения элементов на главной диагонали и произведения элементов на побочной диагонали.
Определитель матрицы обозначается как матрица, заключенная в прямых скобках. Рассмотрим практический пример:
Для матрицы размером используют правило треугольника, но мы рассмотрим более простое правило:
Здесь прослеживается некая тенденция насчёт рекурсивного вычисления определителя, однако это долго и неэффективно.
Свойства определителя
Основываясь на этих свойствах, был разработан метод Гаусса вычисления определителя, который мы обязательно рассмотрим в следующей статье, которая также затронет миноры, алгебраические дополнения и теорему Лапласа.
Программируем на Python
Для программирования матриц как массивов мы будем использовать NumPy (от англ. Numeric Python) — великолепный пакет для математических вычислений, написанный на С и Fortran.
Чтобы создать матрицу, воспользуемся функцией np.array, передав туда двумерный список с числами:
Для создания единичной и нулевой матриц воспользуемся функциями np.eye и np.zeros соответственно.
Различие в аргументах очевидно, так как единичная матрица может быть только квадратной и в качестве аргумента принимает кол-во строк и столбцов. А np.zeros предназначена не только для создания двумерных массивов, поэтому мы в качестве аргумента передаем форму массива (в нашем случае размерность равна ).
Транспонировать матрицу (если вдаваться в детали, то правильнее сказать массив, но ради удобства мы будем называть двумерный массив матрицей) можно тремя способами:
Чтобы вычислить определитель матрицы, воспользуемся функцией np.linalg.det :
Модуль np.linalg очень интересен. В нем «запрограммирована» почти вся линейная алгебра 🙂
Заключение
На этом статья заканчивается. Если вас интересует не только линейная алгебра, но и математический анализ, советую прочитать «Производная. Базовые определения и термины«.
А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.