三角和对称矩阵的特征打包存储和优化操作

时间:2016-07-17 10:45:11

标签: c++ matrix eigen

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

的含义
  

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

他们提到了对称矩阵的相同内容

  

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

所以我的问题是:

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

  2. Eigen是否打包存储或特殊的小型存储?

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

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. 正如您所注意到的,视图概念是对称矩阵和三角矩阵的特殊排列;
  2. 不,使用特殊存储方案为三角矩阵节省50%的内存空间似乎对Eigen没有多大吸引力;
  3. 在一般密集矩阵方案中存储三角矩阵时,不使用50%的空间。您可以使用未使用的部分来存储其他内容;
  4. 是的,您可以使用对称/自我联合视图为gcc48-c++_4.8.1-ubuntu14_amd64.deb
  5. 等操作节省50%的运行时间

    此代码以不同的方式计算A * A^T,并在您的问题3上进行演示。您可以比较结果并使用合理的大尺寸来衡量运行时间。

    A * A^T

    输出:

    #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;
    }