Матрицы широко используются в компьютерных науках, но их не так просто реализовать/создать на 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% меньше времени, необходимого, кроме того, если мы проигнорируем время, необходимое для вывода массива на консоль, процент увеличится еще больше.
Если вам интересно, как я рассчитал время программы, вот код.