C++ 三角矩阵和对称矩阵的特征压缩存储和优化运算

C++ 三角矩阵和对称矩阵的特征压缩存储和优化运算,c++,matrix,eigen,C++,Matrix,Eigen,到目前为止,我知道eigen并没有为三角形或对称矩阵提供任何特殊的优化操作。而且它也不使用这些矩阵的任何打包存储。三角矩阵和对称矩阵都被视为正规矩阵。但伊根有一个概念。但在Eigen的文档中,他们提到他们对对称矩阵和三角矩阵都执行优化操作。而且我也不明白他们所说的是什么意思,相反的三角形部分从不被引用,可以用来存储其他信息 TriangularView提供稠密矩阵的三角形部分的视图,以及 允许对其执行优化操作。对边三角形 零件从不被引用,可用于存储其他信息 他们对对称矩阵也提到了同样的事情 就像

到目前为止,我知道eigen并没有为三角形或对称矩阵提供任何特殊的优化操作。而且它也不使用这些矩阵的任何打包存储。三角矩阵和对称矩阵都被视为正规矩阵。但伊根有一个概念。但在Eigen的文档中,他们提到他们对对称矩阵和三角矩阵都执行优化操作。而且我也不明白他们所说的
是什么意思,相反的三角形部分从不被引用,可以用来存储其他信息

TriangularView提供稠密矩阵的三角形部分的视图,以及 允许对其执行优化操作。对边三角形 零件从不被引用,可用于存储其他信息

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

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

所以我的问题是:

本征把对称矩阵和三角矩阵看成是特殊矩阵,还是把它看成是任何其它特征矩阵的正规矩阵?

  • Eigen是打包存储还是特殊紧凑存储

  • 这条线是什么意思?相对的三角形部分永远不会被引用,可以用来存储其他信息

  • eigen对三角形矩阵和对称矩阵都执行优化操作吗


  • 虽然这里似乎有4个问题,但都是密切相关的。是/否答案对我来说没问题,问题3除外

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

  • 正如您所注意到的,视图概念是对称矩阵和三角矩阵的特殊排列
  • 不,使用特殊存储方案为三角矩阵节省50%的存储空间对Eigen来说似乎不是很有吸引力
  • 在一般稠密矩阵格式中存储三角形矩阵时,不使用50%的空间。您可以使用未使用的部分来存储其他内容
  • 是的,您可以使用对称/自伴随视图为
    A*A^T
  • 此代码以不同的方式计算
    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