Изначально опубликовано на dev.to

Матрица (1999) - это научно-фантастический фильм, в котором исследуется идея реальности, которую мы знаем как смоделированный опыт.

Хорошо, теперь, когда это решено, мы можем перейти к сливкам из молока. Что такое матрицы, почему мы их используем и для чего мы их используем?

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

Проще говоря, матрица - это способ представления данных. Данные обычно в той или иной форме числовые - это может быть набор чисел, символов или выражений. Он представлен в виде сетки или 2D-массива, например:

[ [ -1, -1, -1 ],
  [ -1,  9, -1 ],
  [ -1, -1, -1 ] ]

Итак, как вы можете видеть здесь, у нас есть массив, состоящий из трех массивов, каждый из которых является строкой в ​​матрице, а каждый состоит из трех элементов. Сетка 3x3, всего 9 элементов. Для большей уверенности давайте рассмотрим некоторые основы. Если бы мы хотели получить доступ к верхнему правому элементу, мы бы получили доступ к первой строке (row = 0, с использованием нулевой индексации), а затем к третьему и последнему элементу (column = 2) или matrix[0][2]. Если бы мы хотели получить доступ к центральному элементу - 9 - мы бы получили доступ ко второму элементу во второй строке или matrix[1][1].

По сути, это набор из нескольких строк и нескольких столбцов. Что в этом особенного? Что ж, как и любая структура данных, ее сила зависит от того, как она используется. За исключением специальных типов, матрицы имеют фиксированные размеры - поэтому, хотя данные внутри них могут изменяться, матрица размером 3x3, подобная приведенной выше, останется матрицей 3x3. Содержащиеся данные также каким-то образом связаны. Конечно, если вы сами реализуете матрицу, вы можете удалить строку или столбец или добавить случайные данные. Но это вроде бы сделало бы его устаревшим, не так ли? Каким бы абстрактным оно ни было, матрицы - это то, чем они являются, потому что они предназначены для определенной цели - в этом вся прелесть структур данных в целом.

Одним из преимуществ матричной структуры является ее способность применять линейные преобразования. Я собираюсь использовать определение линейного преобразования, найденное здесь:

«Линейное преобразование - это функция от одного векторного пространства
к другому, которая учитывает лежащую в основе (линейную) структуру каждого векторного пространства»

Здесь много математики, особенно линейной алгебры, и я дам несколько ссылок для дальнейшего чтения ниже. Однако это выходит за рамки данной публикации. Короче говоря, операции, которые можно упростить до линейного отображения, являются идеальным приложением для работы с матрицами. Рассмотрим этот простой пример:

Давайте увеличим эту идею до некоторой степени сложности и практичности. У нас есть файл цифрового изображения, представленный в пикселях. Эти пиксели представлены в виде сетки - матрицы. Мы хотим, чтобы все пиксели изображения изменились на некоторую величину - возможно, мы хотим, чтобы изображение было ярче. Помните, что пиксели часто представлены как комбинация красного, синего и зеленого каналов, каждый из которых имеет значение от 0 до 255. В цифровом пространстве цвет является аддитивным: чем выше значение, тем насыщеннее и ярче становится цвет. Фильтры яркости могут быть более сложными, но давайте просто скажем, что мы хотим увеличить каждое rgb значение на 30. Видите, куда мы идем, здесь? Каждое значение требует, чтобы матрица изменилась на фиксированную величину - 30. линейное отображение - случай сложения матриц!

Матрицы имеют огромное значение в обработке графики для подобных случаев. Его можно использовать для других операций, таких как поворот изображения, цветовые фильтры, деформация, масштабирование, свертка * и так далее. Они не ограничиваются 2D-изображениями - они также полезны при рендеринге 3D-графики. Хотя графика - основное приложение матриц, на этом все не заканчивается - в конце концов, это структура данных, и как таковая может быть полезна при общем преобразовании, анализе и представлении данных.

По сути, вывод заключается в следующем: из-за своей структуры данные, представленные в виде матриц, могут сделать сложные операции очень эффективными. Как отмечает Ларри Хардести в статье MIT News о матричном применении:

«… это указывает на одну из причин того, что матрицы так распространены в информатике: они позволяют компьютерам, по сути, выполнять большую часть тяжелой вычислительной работы заранее. Создание матрицы, дающей полезные результаты вычислений, может быть трудным, но выполнение умножения матриц обычно затруднительно ».

А это взбитые сливки и посыпка. Мы, люди, делаем столько работы Большого мозга, сколько необходимо, и передаем ее на компьютер, чтобы сделать за нас настоящую работу Мускулистого Варвара.

Конечно, все дело в использовании правильного инструмента для работы. Возможно, вам не придется работать с матрицами очень часто, или вы можете интенсивно ими пользоваться. Когда это будет последнее, вы наверняка будете рады, что они существуют.

Ссылки:

С, удачного кодирования!