Собственный эффективный тип для плотной симметричной матрицы
Имеет ли Eigen эффективный тип для хранения плотной, фиксированной, симметричной матрицы? (эй, они вездесущие!)
т.е. для N = 9 он должен хранить только (1 + 9) * 9/2 == 45 элементов и имеет соответствующие операции. Например, должно быть эффективное дополнение двух симметричных матриц, которые возвращают симметричную симметричную матрицу.
Если нет такой вещи, какие действия (выглядит как this), я должен сделать, чтобы ввести такой тип в Eigen? Есть ли у него понятия "взгляды"? Могу ли я написать что-то вроде "матричного представления" для моего собственного типа, что сделало бы его Eigen-friednly?
P.S. Вероятно, я могу рассматривать простой массив как матрицу 1xN с помощью map и выполнять операции над ним. Но это не самое чистое решение.
Ответы
Ответ 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 ссылка: (для реальных матриц самосопряженных == симметричных).
Как и для треугольной матрицы, вы можете ссылаться на любую треугольную часть квадратной матрицы, чтобы увидеть ее как самосопряженную матрицу и выполнить специальные и оптимизированные операции. Опять противоположная треугольная часть никогда не ссылается и может использоваться для хранения другой информации.
Если память не является большой проблемой, я бы предложил оставить незаписанную часть матрицы пустой. (Более читаемый код, без проблем с производительностью.)