使用Eigen解Ax=b线性方程组

#include <iostream>
using namespace std;
#include <ctime>
// Eigen 部分
#include <Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <Eigen/Dense>

#define MATRIX_SIZE 100

/****************************
* 本程序演示了 Eigen 基本类型的使用
****************************/

int main( int argc, char** argv )
{
    // 解方程
    // 我们求解 A * x = b 这个方程
    // 直接求逆自然是最直接的,但是求逆运算量大

    Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > A1;
    A1 = Eigen::MatrixXd::Random( MATRIX_SIZE, MATRIX_SIZE );

    Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > b1;
    b1 = Eigen::MatrixXd::Random( MATRIX_SIZE, 1 );

    clock_t time_stt = clock(); // 计时
    // 直接求逆
    Eigen::Matrix<double,MATRIX_SIZE,1> x = A1.inverse()*b1;
    cout <<"time use in normal inverse is " << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;
    cout<<x<<endl;
    // QR分解colPivHouseholderQr()
    time_stt = clock();
    x = A1.colPivHouseholderQr().solve(b1);
    cout <<"time use in Qr decomposition is " <<1000*(clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;
    cout <<x<<endl;
    //QR分解fullPivHouseholderQr()
    time_stt = clock();
    x = A1.fullPivHouseholderQr().solve(b1);
    cout <<"time use in Qr decomposition is " <<1000*(clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;
    cout <<x<<endl;
    /* //llt分解 要求矩阵A正定
    time_stt = clock();
    x = A1.llt().solve(b1);
    cout <<"time use in llt decomposition is " <<1000*(clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;
    cout <<x<<endl;*/
    /*//ldlt分解  要求矩阵A正或负半定
    time_stt = clock();
    x = A1.ldlt().solve(b1);
    cout <<"time use in ldlt decomposition is " <<1000*(clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;
    cout <<x<<endl;*/
    //lu分解 partialPivLu()
    time_stt = clock();
    x = A1.partialPivLu().solve(b1);
    cout <<"time use in lu decomposition is " <<1000*(clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;
    cout <<x<<endl;
    //lu分解(fullPivLu()
    time_stt = clock();
    x = A1.fullPivLu().solve(b1);
    cout <<"time use in lu decomposition is " <<1000*(clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;
    cout <<x<<endl;

    return 0;

}

猜你喜欢

转载自blog.csdn.net/hanshihao1336295654/article/details/83512082
今日推荐