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

标签 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 计算输入矩阵的逆矩阵,这在计算上是昂贵的(如讨论的 here )。

有什么方法可以避免使用 boost 功能吗?

最佳答案

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)执行就地前向/后向替换。所以一切都尽可能高效。

关于c++ - 使用 boost 的 LU 求解器但避免计算逆矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21522788/

相关文章:

python - 使用 python igraph 绘制社区

java - java中的分解,什么时候才够?

c++ - 如何使用 WinRT 在 Windows 8 Metro 应用程序中播放声音文件?

c++ - 哪个算法需要 "visitor"(boost 库中的术语)?

c++ - 如何使用chdir更改目录?

c++ - 为什么在 boost python vector 索引套件中需要比较运算符?

c++ - cmake:创建一个新的库目标,其中包含一个预构建的库

matrix - LAPACK/BLAS 或其他地方是否有 Fortran 子例程来计算 LDL 分解?

c++ - Visual Studio 中 C++ 中 chkstk.asm stackoverflow 异常的建议

c++ - 如何检查路径是否指向可执行文件?