通常我们可以说 Eigen 主要针对速度进行优化,而不是针对存储空间进行优化。
- 您已经注意到,视图概念是对称矩阵和三角矩阵的特殊排列;
- 不,使用特殊存储方案为三角矩阵节省 50% 的内存空间似乎对 Eigen 不是很有吸引力;
- 在一般密集矩阵方案中存储三角矩阵时,50% 的空间没有被使用。您可以使用未使用的部分来存储其他东西;
- 是的,您可以使用对称/自伴随视图为
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