使用boost的LU求解器,但避免计算矩阵逆?

时间:2014-02-03 08:37:51

标签: c++ boost decomposition boost-ublas

我正在使用Boost提供的LU分解来解决C ++中的线性方程组。

static void boostLU(const boost::numeric::ublas::matrix<double> &A, const boost::numeric::ublas::matrix<double> &y)
{
    boost::numeric::ublas::matrix<double> Afactorized = A;  
    boost::numeric::ublas::matrix<double> Ainv = boost::numeric::ublas::identity_matrix<float>(A.size1());
    boost::numeric::ublas::vector<double> x_boost(Afactorized.size1(), 1);
    boost::numeric::ublas::permutation_matrix<size_t> pm(Afactorized.size1());
    boost::numeric::ublas::matrix<double> result = boost::numeric::ublas::identity_matrix<float>(A.size1());

    int singular = boost::numeric::ublas::lu_factorize(Afactorized,pm);
    if (singular)
    {
        throw std::runtime_error("[LinearSolver<LU>::solve()] A is singular.");
    } 
    result = y;
    boost::numeric::ublas::lu_substitute(Afactorized, pm, result);
}

似乎lu_substitute计算输入matix的倒数,这计算成本很高(如here所述)。

有没有办法避免使用提升功能?

1 个答案:

答案 0 :(得分:0)

lu_substitute不计算逆。

查看源代码(http://www.boost.org/doc/libs/1_55_0/boost/numeric/ublas/lu.hpp):lu_substitute调用inplace_solve,而inplace_solve(此处定义:http://www.boost.org/doc/libs/1_55_0/boost/numeric/ublas/triangular.hpp)执行向前/向后替换。所以一切都是如此高效。