Предпосылкой для постановки этого вопроса является то, что я решаю систему линеаризованных уравнений (Ax = b), где A - это матрица (обычно размером менее 100x100), а x и b - векторы.Я использую прямой метод, то есть сначала инвертирую A, а затем нахожу решение по x = A ^ (- 1) b.Этот шаг повторяется в итеративном процессе до сходимости.
То, как я делаю это сейчас, используя матричную библиотеку (MTL4):
Для каждой итерации я копирую все коэффициентыиз A (значения) в объекте матрицы, затем инвертировать.Это самый простой и безопасный вариант.
Использование вместо него массива указателей:
В моем конкретном случае коэффициенты A обновляются между каждой итерацией.Эти коэффициенты хранятся в разных переменных (некоторые являются массивами, некоторые нет).Был бы потенциал для увеличения производительности, если бы я установил A в виде массива, содержащего указатели на эти переменные коэффициента, а затем инвертировал бы A на месте?
Приятная вещь в последнем варианте состоит в том, что, как только я настроилуказатели в A до первой итерации, мне не нужно было бы копировать значения между последовательными итерациями.Значения, на которые указывают в A, будут автоматически обновляться между итерациями.
Таким образом, вопрос производительности сводится к следующему, как я вижу:
- Процесс инверсии матрицы занимает примерно столько же временипри условии, что разыменование указателей является недорогим.
- Массив указателей не требует дополнительной памяти для матрицы, содержащей значения.
- Опция массива указателей не должна копировать все значения NxNA между каждой итерацией.
- Значения, которые указывают на опцию массива указателей, обычно НЕ упорядочиваются в памяти.Надеемся, что все значения лежат в памяти относительно близко, но * A [0] [1] обычно не рядом с * A [0] [0] и т. Д.
Есть какие-либо комментарии к этому?Будет ли последнее замечание отрицательно влиять на производительность, таким образом взвешивая положительный эффект производительности?