到目前为止,我知道eigen不会为三角形或对称矩阵提供任何特殊的优化操作。而且它也没有为那些矩阵使用任何打包存储。三角和对称矩阵都被认为是正规矩阵。但是eigen有view的概念。但在Eigen的文档中,他们提到它们对对称矩阵和三角矩阵都执行优化操作。我也不明白The opposite triangular part is never referenced and can be used to store other information
TriangularView给出了密集矩阵的三角形部分的视图 允许对其执行优化操作。相反的三角形 part永远不会被引用,可以用来存储其他信息。
他们提到了对称矩阵的相同内容
就像三角矩阵一样,您可以参考任何三角形部分 方阵矩阵将其视为自相关矩阵并执行 特殊和优化的操作。再次是相反的三角形部分 永远不会被引用,可用于存储其他信息。
所以我的问题是:
本征是否将对称矩阵和三角矩阵视为特殊矩阵,还是将其视为与任何其他特征矩阵一样的正常矩阵?
Eigen是否打包存储或特殊的小型存储?
这条线是什么意思相反的三角形部分从未被引用,可以用来存储其他信息?
特征是否对三角形和对称矩阵执行任何优化操作?
虽然这里似乎有4个问题,但都是密切相关的。是/否答案对我来说没有问题,除了问题3。
答案 0 :(得分:2)
一般来说,我们可以说Eigen主要针对速度进行优化,但不针对存储空间进行优化。
gcc48-c++_4.8.1-ubuntu14_amd64.deb
此代码以不同的方式计算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;
}