我正在努力学习助力。我想看看如何解决稀疏矩阵的Ax = B线性方程的例子。我看到使用umfpack的例子,但在boost 1_58版本中没有umfpack,我修改了一下这个例子,只是尝试构建应用程序。在开始示例之前我还安装了boost。这是代码:
#include <iostream>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/vector_sparse.hpp>
//#include <boost/numeric/ublas/traits/ublas_sparse.hpp>
//#include <boost/numeric/bindings/umfpack/umfpack.hpp>
#include <boost/numeric/ublas/io.hpp>
namespace ublas = boost::numeric::ublas;
//namespace umf = boost::numeric::bindings::umfpack;
int main() {
ublas::compressed_matrix<double, ublas::column_major, 0,
ublas::unbounded_array<int>, ublas::unbounded_array<double> > A(5, 5, 12);
ublas::vector<double> B(5), X(5);
A(0, 0) = 2.; A(0, 1) = 3;
A(1, 0) = 3.; A(1, 2) = 4.; A(1, 4) = 6;
A(2, 1) = -1.; A(2, 2) = -3.; A(2, 3) = 2.;
A(3, 2) = 1.;
A(4, 1) = 4.; A(4, 2) = 2.; A(4, 4) = 1.;
B(0) = 8.; B(1) = 45.; B(2) = -3.; B(3) = 3.; B(4) = 19.;
/*
umf::symbolic_type<double> Symbolic;
umf::numeric_type<double> Numeric;
umf::symbolic(A, Symbolic);
umf::numeric(A, Symbolic, Numeric);
umf::solve(A, X, B, Numeric);
*/
std::cout << X << std::endl; // output: [5](1,2,3,4,5)
}
任何人都可以帮助我并展示如何使用新的提升解决稀疏矩阵的简单线性方程?
答案 0 :(得分:1)
你可以通过提升获得解决方案,但效率不高。 UMFPACK扩展是众所周知的并且很有名。使用它(你使用提升,所以你的要求是匹配的。)
为了lets-perpetuate-copy-and-paste的利益,这里只有Boost解决方案:¹
<强> Live On Coliru 强>
#include <iostream>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/vector_sparse.hpp>
#include <boost/numeric/ublas/lu.hpp>
#include <boost/numeric/ublas/io.hpp>
namespace ublas = boost::numeric::ublas;
int main()
{
ublas::compressed_matrix<double, ublas::column_major, 0> Matrix A(5, 5, 12);
A(0, 0) = 2.; A(0, 1) = 3.;
A(1, 0) = 3.; A(1, 2) = 4.; A(1, 4) = 6.;
A(2, 1) = -1.; A(2, 2) = -3.; A(2, 3) = 2.;
A(3, 2) = 1.;
A(4, 1) = 4.; A(4, 2) = 2.; A(4, 4) = 1.;
ublas::vector<double> y(5);
y(0) = 8.;
y(1) = 45.;
y(2) = -3.;
y(3) = 3.;
y(4) = 19.;
ublas::permutation_matrix<size_t> pm(A.size1());
lu_factorize(A, pm);
lu_substitute(A, pm, y);
std::cout << y << std::endl; // output: [5](1,2,3,4,5)
}
打印:
[5](1,2,3,4,5)