gpt4 book ai didi

c++ - Eigen LDLT 比 LLT 慢?

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:50 24 4
gpt4 key购买 nike

我正在使用 Eigen 3 的 Cholesky 模块求解线性方程组。 Eigen 文档指出,使用 LDLT而不是 LLT为此目的会更快,但我的基准测试显示不同的结果。

我使用以下代码进行基准测试:

#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;
}

我在 Windows 上用 g++ -std=c++11 -O2 -o llt.exe llt.cc 编译了它,这是我得到的:

LLT decomposition & solving in  6515 + 15 ms.
LDLT decomposition & solving in 8562 + 15 ms.
Total result difference: 1.27354e-006

那么,为什么 LDLT 比 LLT 慢?我是在做错什么还是对文档有误解?

最佳答案

文档的这句话已经过时了。对于 Eigen 的最新版本,对于非常大的矩阵,LLT 应该比 LDLT 快得多,因为 LLT 实现利用了缓存友好的矩阵-矩阵操作,而 LDLT 实现仅涉及旋转和矩阵- vector 操作。使用 devel 分支你的例子给我:

LLT decomposition & solving in  380 + 4 ms.
LDLT decomposition & solving in 2746 + 4 ms.

关于c++ - Eigen LDLT 比 LLT 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23309596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com