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

Матрица — это, по сути, двумерный массив.

Каждую строку матрицы можно рассматривать как массив данных.

Например,

{9, 13, 5, 2} сам по себе является массивом и оказывается первой строкой матрицы.

Точно так же вся матрица может быть записана как;

{
    {9, 13, 5, 2},
    {1, 11, 7, 6},
    {3, 7, 4, 1},
    {6, 0, 7, 10}
}

Это то, что мы сделали бы в Python, чтобы создать массив. Но в C++ все не так просто;

Давайте сначала попробуем создать (или выделить) двумерный массив.

Двумерные массивы в C++:

Предпочтительный способ работы с массивами в C/C++ — это указатели на начало массива в памяти.

Двумерный массив — это массив массивов.

Каждый элемент массива является указателем на другой массив данных. Так что, по сути, это просто замаскированный одномерный массив.

В коде:

Строка 1: мы выделяем новый массив одномерных указателей, который будет содержать указатели на другие массивы.

Строка с 3 по 4: мы выделяем еще 50 массивов внутри каждой строки массива 2d для наших фактических массивов данных.

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

Посмотрим на рабочий код:

Если вы создадите и запустите его,

Это будет ваш вывод, обратите внимание, как он выглядит как матрица.

Конечно, поскольку мы разместили массивы в куче, нам нужно удалить их вручную.

Помните: в C++ нет оператора delete[][]!

Проблема с производительностью:

У нас нет контроля над тем, как распределяется память. Это может быть близко друг к другу или далеко друг от друга.

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

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

Следовательно, итерация выполняется медленнее.

Чтобы представить вещи в перспективе:

Итак, можем ли мы сделать лучше?

Делаем распределение быстрее:

Чтобы сделать это быстрее, мы можем попытаться выделить всю память сразу.

Это можно сделать так:

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

Ячейки приведенной выше таблицы имеют формулу x+y*4.

Проще говоря, мы сообщаем компьютеру: «Мы уже получили доступ к элементам (номер строки) *(ширина массива), ваша задача — получить доступ к следующим элементам. после этого."

Это значительное улучшение производительности:

Почти разница в 0,0003945 с (0,0011057 с — 0,0007112 с), что почти на 35,68% меньше времени, необходимого, кроме того, если мы проигнорируем время, необходимое для вывода массива на консоль, процент увеличится еще больше.

Если вам интересно, как я рассчитал время программы, вот код.