求解矩阵方程耗时比较(直接求逆,Qr分解,LU分解)

测试环境:
  1. C++
  2. Egien库
代码
#include <iostream>
#include <ctime>

#include <Eigen/Core>
#include <Eigen/Dense>
#include <Eigen/LU>
#include <Eigen/Cholesky>

using namespace std;
using namespace Eigen;
/***********************
* solve equation: matrix_NN * x = v_Nd
************************/
const int MATRIX_SIZE = 100;
// https://blog.csdn.net/weixin_41074793/article/details/84241776
int main()
{
        Matrix< double, MATRIX_SIZE, MATRIX_SIZE > matrix_NN;
        matrix_NN = MatrixXd::Random( MATRIX_SIZE, MATRIX_SIZE );
        Matrix<double, MATRIX_SIZE, 1> v_Nd;
        v_Nd = MatrixXd::Random( MATRIX_SIZE,1);
        clock_t time_stt = clock();

        //直接求逆
        Matrix< double, MATRIX_SIZE, 1> x = matrix_NN.inverse()*v_Nd;
        cout << "time use in normal inverse is       " << 1000.0 * (clock() - time_stt) /
                                (double)CLOCKS_PER_SEC << "ms" << endl;
        //Qr分解
        time_stt = clock();
        x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
        cout << "time use in Qr composition is       " << 1000 * (clock() - time_stt) / (double)
            CLOCKS_PER_SEC << "ms" << endl;

        //cholesky分解
        time_stt = clock();
        // 使得NN成为正定矩阵,才能分解
        matrix_NN = matrix_NN.transpose() * matrix_NN;
        x = matrix_NN.partialPivLu().solve(v_Nd);
        cout << "time use in cholesky composition is " << 1000 * (clock() - time_stt) / (double)
            CLOCKS_PER_SEC << "ms" << endl;

        //LU分解
        time_stt = clock();
        x = matrix_NN.partialPivLu().solve(v_Nd);
        cout << "time use in LU composition is       " << 1000 * (clock() - time_stt) / (double)
            CLOCKS_PER_SEC << "ms" << endl;

    return 0;
}


#### 结果

time use in normal inverse is 1547.72ms
time use in Qr composition is 37.475ms
time use in cholesky composition is 13.074ms
time use in LU composition is 5.242ms

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
矩阵LU分解是一种求解矩阵的算法,通过将矩阵分解为下三角矩阵L和上三角矩阵U的积,然后利用这两个矩阵求解矩阵。 首先,我们需要将矩阵A进行LU分解,得到下三角矩阵L和上三角矩阵U。具体步骤如下: 1. 初始化L为单位下三角矩阵,即L的对角线元素全为1,U为矩阵A的副本。 2. 对于矩阵U的每一列,我们将其第一行元素记为U[1, j],然后计算L的第一列元素L[i, 1](i = 2, 3, ..., n)以及矩阵U的第i行元素U[i, j](i = 2, 3, ..., n): - L[i, 1] = U[i, 1] / U[1, 1] - U[i, j] = U[i, j] - L[i, 1] * U[1, j] 3. 对于矩阵U的第二列至第n列,我们依次计算L的第一行至第n-1行元素以及矩阵U的第i行元素(i = 2, 3, ..., n): - L[i, k] = (U[i, k] - sum(L[i, j] * U[j, k] for j in range(1, k))) / U[k, k] - U[i, j] = U[i, j] - sum(L[i, k] * U[k, j] for k in range(1, j)) 得到矩阵L和矩阵U后,我们可以按照以下步骤计算矩阵: 1. 初始化矩阵I为单位矩阵。 2. 对于每一列的矩阵I的列向量b,利用L和U解出方程Ax = b,即x = U^(-1)L^(-1)b。 3. 将得到的每一列向量x按列组合起来得到矩阵。 需要注意的是,在实际计算中,如果遇到U的对角线元素接近或者等于0的情况,则矩阵不存在,因此需要避免这种情况的发生。同时,如果矩阵A是一个稀疏矩阵,那么LU分解可能不是最优的求解方法,可以考虑使用其他方法求解矩阵

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值