Разреженная симметричная матричная инициализация - PullRequest
0 голосов
/ 08 ноября 2019

Я использую Eigen::SparseMatrix для большой матрицы системы линейных уравнений, и в настоящее время я настраиваю ее с помощью setFromTriplets().

Моя проблема в том, что я не могу выяснить, возможно ли с помощью этого эффективно инициировать симметричную матрицу. Пока я должен хранить в памяти как верхнюю, так и нижнюю его части (в списке триплетов, что гораздо хуже, поскольку существует не только само значение, но и его индексы).

Было бы лучше, если бы эта функция могла немедленно скопировать недиагональные элементы при столкновении. Или уже есть такая функциональность?

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

1 Ответ

2 голосов
/ 11 ноября 2019

Если у вас есть матрица S только с верхней (или нижней) треугольной половиной, вы можете использовать

S.selfadjointView<Eigen::Upper>();  // or Eigen::Lower

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

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

Демонстрация минимального использования: https://godbolt.org/z/6UyDGZ

Кроме того, все решатели, связанные с Холецким , естественно, просто рассматривают половину входной матрицы.

...