Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 本征LDLT比LLT慢?_C++_Eigen - Fatal编程技术网

C++ 本征LDLT比LLT慢?

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

我用特征3的Cholesky模来解一个线性方程组。Eigen文档指出,使用而不是将更快,但我的基准测试显示了不同的结果

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

#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.