【问题标题】:Eigen packed storage and optimized operations for Triangular and symmetric matrices三角形和对称矩阵的特征压缩存储和优化操作
【发布时间】:2016-07-17 10:45:10
【问题描述】:

到目前为止,我知道 eigen 没有为三角形或对称矩阵提供任何特殊的优化操作。而且它也不为这些矩阵使用任何打包存储。三角矩阵和对称矩阵都被视为正规矩阵。但是 eigen 有view 的概念。但在 Eigen 的文档中,他们提到他们对对称矩阵和三角矩阵执行优化操作。而且我也不明白The opposite triangular part is never referenced and can be used to store other information是什么意思

TriangularView 给出了密集矩阵的三角形部分的视图,并且 允许对其执行优化操作。对面三角形 部分永远不会被引用,可用于存储其他信息。

他们对对称矩阵提到了同样的事情

就像三角矩阵一样,你可以引用任何三角部分 的方阵将其视为自伴随矩阵并执行 特殊和优化的操作。再次相反的三角形部分 永远不会被引用,可用于存储其他信息。

所以我的问题是:

  1. 本征是否将对称矩阵和三角矩阵视为特殊矩阵,还是将其视为与任何其他本征矩阵一样的普通矩阵?

  2. Eigen 是做打包存储还是特殊的紧凑存储?

  3. 这条线是什么意思对面的三角形部分从不被引用,可以用来存储其他信息?

  4. eigen 是否对三角矩阵和对称矩阵执行任何优化操作?

虽然这里似乎有 4 个问题,但都是密切相关的。除了问题 3,是/否回答对我来说都可以。

【问题讨论】:

    标签: c++ matrix eigen


    【解决方案1】:

    通常我们可以说 Eigen 主要针对速度进行优化,而不是针对存储空间进行优化。

    1. 您已经注意到,视图概念是对称矩阵和三角矩阵的特殊排列;
    2. 不,使用特殊存储方案为三角矩阵节省 50% 的内存空间似乎对 Eigen 不是很有吸引力;
    3. 在一般密集矩阵方案中存储三角矩阵时,50% 的空间没有被使用。您可以使用未使用的部分来存储其他东西;
    4. 是的,您可以使用对称/自伴随视图为A * A^T 等操作节省 50% 的运行时间

    此代码以不同的方式计算A * A^T,并附有关于您的问题 3 的演示。您可以比较结果并以合理的大尺寸测量运行时间。

    #include <iostream>
    #include "Eigen/Eigen"
    
    int main() {
      using namespace Eigen;
    
      const int n = 5;
      Eigen::MatrixXd a(n, n), b(n, n), c(n, n), d(n, n);
      a.setRandom();
      b.setZero();
      c.setZero();
      d.setZero();
      d.bottomLeftCorner(n / 2, n / 2).setConstant(100);
    
      std::cout << "original d =\n" << d << std::endl;
    
      b = a * a.transpose();
      std::cout << "b=\n" << b << std::endl;
    
      c.selfadjointView<Upper>().rankUpdate(a);
      std::cout << "c=\n" << c << std::endl;
    
      d.selfadjointView<Upper>().rankUpdate(a);
      std::cout << "d=\n" << d << std::endl;
    
      return 0;
    }
    

    输出:

    original d =
      0   0   0   0   0
      0   0   0   0   0
      0   0   0   0   0
    100 100   0   0   0
    100 100   0   0   0
    b=
      2.45959  0.767369   1.13659 -0.511436   1.29631
     0.767369  0.557756  0.124955 -0.480089  0.434794
      1.13659  0.124955   1.39678 -0.660623   0.87062
    -0.511436 -0.480089 -0.660623   1.43841 -0.103395
      1.29631  0.434794   0.87062 -0.103395   2.02476
    c=
      2.45959  0.767369   1.13659 -0.511436   1.29631
            0  0.557756  0.124955 -0.480089  0.434794
            0         0   1.39678 -0.660623   0.87062
            0         0         0   1.43841 -0.103395
            0         0         0         0   2.02476
    d=
      2.45959  0.767369   1.13659 -0.511436   1.29631
            0  0.557756  0.124955 -0.480089  0.434794
            0         0   1.39678 -0.660623   0.87062
          100       100         0   1.43841 -0.103395
          100       100         0         0   2.02476
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2018-08-06
      • 2018-03-10
      • 1970-01-01
      • 2018-10-02
      • 2021-08-25
      相关资源
      最近更新 更多