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

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

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

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

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

P.S. Вероятно, я могу рассматривать простой массив как матрицу 1xN с помощью map и выполнять операции над ним. Но это не самое чистое решение.

4b9b3361

Ответ 1

Да, eigen3 имеет концепцию views. Однако он ничего не делает для хранения. Так же, как идея, вы можете поделиться более крупным блоком для двух симметричных матриц того же типа:

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;

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

Ответ 2

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

В eigen ссылка: (для реальных матриц самосопряженных == симметричных).

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

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