Собственный эффективный тип для плотной симметричной матрицы

Есть ли собственный есть эффективный тип для хранения плотной симметричной матрицы фиксированного размера? (эй, они вездесущи!)

То есть для N = 9 он должен хранить только (1 + 9) * 9/2 == 45 элементов и имеет соответствующие операции. Например, должно быть эффективное сложение двух симметричных матриц, которое возвращает симмилярную симметричную матрицу.

Если нет такой вещи, какие действия (выглядит как этот) Мне надо сделать чтобы ввести такой тип в Eigen? Есть ли у него понятия «взгляды»? Могу ли я написать что-то вроде «матричного вида» для своего собственного типа, что сделало бы его Eigen-friednly?

Постскриптум Возможно, я могу рассматривать простой массив как матрицу 1xN, используя карта, и делать операции на нем. Но это не самое чистое решение.

16

Решение

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

Matrix<float,4,4> A1, A2; // assume A1 and A2 to be symmetric
Matrix<float,5,4> A;
A.topRightCorner<4,4>().triangularView<Upper>() = A1;
A.bottomLeftCorner<4,4>().triangularView<Lower>() = A2;

Хотя это довольно громоздко, и я бы использовал его, только если ваша память действительно драгоценна.

9

Другие решения

Упакованное хранилище симметричных матриц является большой враг векторизованного кода, то есть скорости.
Стандартная практика заключается в хранении соответствующих коэффициентов N * (N + 1) / 2 в верхней или нижней треугольной части полной плотной матрицы NxN и оставлении оставшейся (N-1) * N / 2 без ссылок. Все операции над симметричной матрицей затем определяются с учетом этого специфического хранилища. В Eigen у вас есть понятие треугольные и самосопряженные взгляды для получения этого.

От собственный ссылка: (для вещественных матриц самосопряженная == симметричная).

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

Если память не является большой проблемой, я бы предложил оставить пустую часть матрицы без ссылок. (Более читаемый код, без проблем с производительностью.)

8

Если вы все еще хотите реализовать что-то в Eigen, вот исследовательская статья об оптимизированном упакованном хранилище для треугольных (и полосчатых) матриц, которая претендует на достижение хорошей вычислительной производительности:

Туфик Баруди, Рашид Сегир, Винсент Лохнер. «Оптимизация операций с треугольными и полосовыми матрицами с использованием 2d-упакованных макетов».
ACM транзакции по архитектуре и оптимизации кода, Ассоциация вычислительной техники, 2017, 14 (4), стр. 1 — 19. <10,1145 / 3162016>.
https://hal.inria.fr/hal-01633724/file/BSL17-2dpacked.pdf

0
По вопросам рекламы [email protected]