1

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 は入力行列の逆数を計算しているように見えますが、これは計算コストが高くなります (ここで説明したように)。

ブースト機能を使用してそれを回避する方法はありますか?

4

1 に答える 1

1

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 ) は、前方/後方置換を置き換えます。したがって、すべてが可能な限り効率的です。

于 2014-02-03T09:13:28.710 に答える