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

4 c++ matrix eigen

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

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

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

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

所以我的问题是:

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

  2. Eigen 是否进行打包存储或特殊紧凑存储?

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

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

虽然看起来有4个问题,但都是密切相关的。除了问题 3 之外,是/否答案对我来说都可以。

kan*_*yin 5

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

  1. 正如您所注意到的,视图概念是对称矩阵和三角矩阵的特殊排列;
  2. 不,通过特殊的存储方案为三角矩阵节省 50% 的内存空间,对于 Eigen 来说似乎没有太大吸引力;
  3. 当以一般稠密矩阵方案存储三角矩阵时,50%的空间没有被使用。您可以使用未使用的部分来存储其他东西;
  4. 是的,您可以使用对称/自伴随视图来节省 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)