C++ 本征LDLT比LLT慢?
我用特征3的Cholesky模来解一个线性方程组。Eigen文档指出,使用而不是将更快,但我的基准测试显示了不同的结果 我使用以下代码进行基准测试:C++ 本征LDLT比LLT慢?,c++,eigen,C++,Eigen,我用特征3的Cholesky模来解一个线性方程组。Eigen文档指出,使用而不是将更快,但我的基准测试显示了不同的结果 我使用以下代码进行基准测试: #include <iostream> #include <chrono> #include <Eigen/Core> #include <Eigen/Cholesky> using namespace std; using namespace std::chrono; using namespace
#include <iostream>
#include <chrono>
#include <Eigen/Core>
#include <Eigen/Cholesky>
using namespace std;
using namespace std::chrono;
using namespace Eigen;
int main()
{
MatrixXf cov = MatrixXf::Random(4200, 4200);
cov = (cov + cov.transpose()) + 1000 * MatrixXf::Identity(4200, 4200);
VectorXf b = VectorXf::Random(4200), r1, r2;
r1 = b;
LLT<MatrixXf> llt;
auto start = high_resolution_clock::now();
llt.compute(cov);
if (llt.info() != Success)
{
cout << "Error on LLT!" << endl;
return 1;
}
auto middle = high_resolution_clock::now();
llt.solveInPlace(r1);
auto stop = high_resolution_clock::now();
cout << "LLT decomposition & solving in " << duration_cast<milliseconds>(middle - start).count()
<< " + " << duration_cast<milliseconds>(stop - middle).count() << " ms." << endl;
r2 = b;
LDLT<MatrixXf> ldlt;
start = high_resolution_clock::now();
ldlt.compute(cov);
if (ldlt.info() != Success)
{
cout << "Error on LDLT!" << endl;
return 1;
}
middle = high_resolution_clock::now();
ldlt.solveInPlace(r2);
stop = high_resolution_clock::now();
cout << "LDLT decomposition & solving in " << duration_cast<milliseconds>(stop - start).count()
<< " + " << duration_cast<milliseconds>(stop - middle).count() << " ms." << endl;
cout << "Total result difference: " << (r2 - r1).cwiseAbs().sum() << endl;
return 0;
}
那么,为什么LDLT比LLT慢呢?我是做错了什么还是误解了文档?文档中的这句话已经过时了。对于最新版本的Eigen,对于相当大的矩阵,LLT应该比LDLT快得多,因为LLT实现利用缓存友好的矩阵操作,而LDLT实现只涉及旋转和矩阵向量操作。对于devel分支,您的示例为我提供了:
LLT decomposition & solving in 380 + 4 ms.
LDLT decomposition & solving in 2746 + 4 ms.
你需要cholesky的正定矩阵。所以我认为错误是
cov=(cov+cov.transpose())
加法应该是乘法。@typ1232:使用cov=(cov*cov.transpose())+1000*MatrixXf::Identity(42004200)进行了尝试代码>,但这并没有改变测量的性能。
LLT decomposition & solving in 380 + 4 ms.
LDLT decomposition & solving in 2746 + 4 ms.