C++ 三角矩阵和对称矩阵的特征压缩存储和优化运算
到目前为止,我知道eigen并没有为三角形或对称矩阵提供任何特殊的优化操作。而且它也不使用这些矩阵的任何打包存储。三角矩阵和对称矩阵都被视为正规矩阵。但伊根有一个概念。但在Eigen的文档中,他们提到他们对对称矩阵和三角矩阵都执行优化操作。而且我也不明白他们所说的C++ 三角矩阵和对称矩阵的特征压缩存储和优化运算,c++,matrix,eigen,C++,Matrix,Eigen,到目前为止,我知道eigen并没有为三角形或对称矩阵提供任何特殊的优化操作。而且它也不使用这些矩阵的任何打包存储。三角矩阵和对称矩阵都被视为正规矩阵。但伊根有一个概念。但在Eigen的文档中,他们提到他们对对称矩阵和三角矩阵都执行优化操作。而且我也不明白他们所说的是什么意思,相反的三角形部分从不被引用,可以用来存储其他信息 TriangularView提供稠密矩阵的三角形部分的视图,以及 允许对其执行优化操作。对边三角形 零件从不被引用,可用于存储其他信息 他们对对称矩阵也提到了同样的事情 就像
是什么意思,相反的三角形部分从不被引用,可以用来存储其他信息
TriangularView提供稠密矩阵的三角形部分的视图,以及
允许对其执行优化操作。对边三角形
零件从不被引用,可用于存储其他信息
他们对对称矩阵也提到了同样的事情
就像三角形矩阵一样,可以引用任何三角形部分
将其视为自伴随矩阵并执行
特殊和优化的操作。同样是相反的三角形部分
从未被引用,可用于存储其他信息
所以我的问题是:
本征把对称矩阵和三角矩阵看成是特殊矩阵,还是把它看成是任何其它特征矩阵的正规矩阵?
虽然这里似乎有4个问题,但都是密切相关的。是/否答案对我来说没问题,问题3除外 一般来说,我们可以说Eigen主要针对速度而不是存储空间进行优化
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