我在数字代码中使用Boost的uBLAS并且有一个'重'解算器:
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?LU_Matrix_Inversion
代码效果很好,然而,它很慢。经过一些研究,我找到了UMFPACK,这是一个稀疏矩阵求解器(除此之外)。我的代码生成大型稀疏矩阵,我需要非常频繁地反转(更正确地解决,逆矩阵的值是无关紧要的),因此UMFPACk和BOOST的Sparse_Matrix类似乎是一个幸福的婚姻。
UMFPACK要求由三个向量指定的稀疏矩阵:条目计数,行索引和条目。 (See example)。
我的问题归结为,我可以从BOOST的Sparse Matrix类中有效地获得这三个向量吗?
答案 0 :(得分:6)
这有一个约束力:
http://mathema.tician.de/software/boost-numeric-bindings
这个项目似乎停滞了两年,但它确实做得很好。使用示例:
#include <iostream>
#include <boost/numeric/bindings/traits/ublas_vector.hpp>
#include <boost/numeric/bindings/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)
}
注意强>:
虽然这项工作,我正在考虑转向NETLIB