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

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

Это интуитивное описание того, что такое матрица: двумерный «список» со строками и столбцами. Чтобы получить элемент из матрицы, мы просто сделали бы:

И чтобы напечатать матрицу, мы могли бы сделать:

Или, если бы вместо этого мы хотели строковое представление:

Но что, если мы хотим перебрать все элементы в матрице и добавить 1 к каждому элементу?

Или что, если бы мы захотели изменить размеры матрицы?

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

Альтернатива

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

temp теперь содержит сглаженную версию нашей матрицы, которая позже используется как таковая:

Хммм... а что, если мы просто сделаем temp нашим матричным представлением по умолчанию?

Чтобы получить элементы из этой матрицы:

Сначала это может показаться запутанным, поэтому давайте рассмотрим пример. Если бы мы хотели получить элемент в строке 2, столбце 1 (с индексом 0), mget преобразовал бы эту пару строка-столбец в 2 * cols + 1 => 2 * 3 + 1 => 7. Элемент с индексом 7 (с индексом 0) нашей нечетной матрицы равен 8. Понимание того, как работает mget, может потребовать некоторой визуализации, поэтому попробуйте протестировать другие пары строк и столбцов, чтобы увидеть, как работает формула r * cols + c.

Немедленно очевидные преимущества нашего нового матричного представления можно увидеть в нашем новом и улучшенном коде, добавляющем 1 к каждому элементу:

И наш новый улучшенный преобразователь матрицы:

Хитрость здесь в том, что матричное представление само по себе является просто одномерным списком. Однако, добавляя rows и cols, мы придаем этому одномерному списку «размеры».

Чтобы распечатать матрицу:

Обратите внимание, что i and not i % cols — 1 эквивалентно i > 0 and i % cols = cols — 1. Очевидно, что в нашем новом матричном представлении печать не так проста.

Чтобы получить строковое представление матрицы:

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

А что, если мы хотим сделать наше матричное представление двумерным, как раньше?

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

Некоторые другие интересные вещи, которые вы можете сделать, включают получение диагонали:

И, соответственно, создание матрицы идентичности:

Вывод

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

Пусть ваш код будет чистым, а ваши программы — безошибочными.