密集对称矩阵的特征有效型

qbl*_*ble 17 c++ matrix linear-algebra eigen

Eigen是否具有存储密集,固定大小,对称矩阵的有效类型?(嘿,它们无处不在!)

即N = 9,它应该只存储(1 + 9)*9/2 == 45个元素并且它具有适当的操作.例如,应该有效地添加两个对称矩阵,其返回相似的对称矩阵.

如果没有这样的事情,那么哪些动作(看起来像这样)我应该把这种类型介绍给Eigen?它有"观点"的概念吗?我可以为自己的类型写一些类似"矩阵视图"的东西,这会让它成为特征性的吗?

PS可能我可以使用map将普通数组视为1xN矩阵,并对其进行操作.但这不是最干净的解决方案.

Jak*_*kob 10

是的,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;
Run Code Online (Sandbox Code Playgroud)

虽然它非常麻烦,但如果你的记忆非常珍贵,我只会使用它.


Ste*_*o M 9

盒装存储对称矩阵的是一个的量化代码的敌人,即速度.标准做法是将相关的N*(N + 1)/ 2系数存储在全密集NxN矩阵的上部或下部三角形部分中,并使剩余的(N-1)*N/2不参考.然后通过考虑这种特殊的存储来定义对称矩阵上的所有操作.在本征中,你有三角形和自伴观点的概念来获得这个.

从本参考:(对于真实矩阵selfadjoint == symmetric).

就像三角矩阵一样,您可以参考方阵的任何三角形部分,将其视为自相关矩阵,并执行特殊和优化的操作.同样,相反的三角形部分从未被引用,并且可用于存储其他信息.

除非记忆是一个大问题,否则我建议将矩阵的未引用部分留空.(更易读的代码,没有性能问题.)

  • "对称矩阵的打包存储是矢量化代码的一大敌,即速度" - 对于我的情况,我只需添加这样的矩阵,我不知道在这种情况下它如何影响矢量化."除非记忆是一个大问题" - 记忆是一个真正的问题 - 我有数百万这样的矩阵.. (3认同)