我正在使用 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 计算了输入矩阵的逆,这在计算上是昂贵的(如此处所讨论的)。
有什么办法可以避免使用增强功能?