Я пишу программу, использующую Eigen (если быть точным оптимизатором), которая имеет «горячую петлю», внутри которой я бы хотел избежать выделения памяти, когда это возможно.
При использовании Eigen / Dense IМне удалось организовать вещи так, чтобы все мое выделение памяти выполнялось в конструкторе (с разумным использованием .noalias () и факторизаций LLT на месте) путем вычисления размеров всех рабочих областей, которые мне нужны, заранее и предварительного выделения.
Я бы хотел сделать что-то похожее с собственным / разреженным вариантом кода (насколько это возможно). Конструктор потребует от пользователя предоставить шаблоны разреженности для всех данных, которые я могу использовать для определения размеров и шаблонов разреженности для всех последующих необходимых мне матриц, включая рабочие пространства. Мне нужно выполнить 4 вида операций:
- Разреженные матрично-векторные произведения
- Разложения Холецкого
- Дополнения Шура вида E = H + A '* B* A, где B - диагональная матрица, а H, A - общие разреженные матрицы.
В настоящее время я понимаю следующее:
- Я могу использовать x.noalias ()= A * y (A - разреженные, x, y плотные векторы) для матричных векторных произведений без проблем
- Я могу выполнить матричное сложение, используя приемы с коэффициентами, заполнив их явными нулями, как, например, Какчтобы избежать выделения памяти в разреженных выражениях с Eigen . Это в основном для таких операций, как B = A + s I, где A разрежено, а sI - скалярное кратное тождественности. Я могу просто убедиться, что главная диагональ включена в шаблон разреженности B и выполнить сложение в цикле.
- Начиная с 2017 года, нет способа избежать временного распределения в продуктах с разреженной матрицей, например, C = A * B (https://forum.kde.org/viewtopic.php?f=74&t=140031&p=376933&hilit=sparse+memory#p376933),, и я пока не вижу никаких встроенных функций для разреженных матриц, поэтомуМне придется прикусить этот пункт и принять временное создание.
- По причинам лицензирования я использую пакет факторизации собственного внешнего ЛПНП, который позволяет мне предварительно распределяться на основе этапа символического анализа.
Может ли кто-нибудь предложить быстрый способ организации вычисления Шура E = H + A '* B * A? (Используя заранее известную мне структуру разреженности)