针对y = Ax的Boost线性代数解决方案

nev*_*int 9 c++ math boost linear-algebra

加强有一个吗?其中A,y和x分别是矩阵(稀疏且可以非常大)和向量.y或x都可能是未知的.

我似乎无法在这里找到它:http: //www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm

Inv*_*rse 18

是的,你可以用boost的ublas库来解决线性方程.这是使用LU分解和反向替换得到逆的一种简短方法:

using namespace boost::ublas;

Ainv = identity_matrix<float>(A.size1());
permutation_matrix<size_t> pm(A.size1());
lu_factorize(A,pm)
lu_substitute(A, pm, Ainv);
Run Code Online (Sandbox Code Playgroud)

因此,为了求解线性系统Ax = y,你可以通过取(trans(A)A)^ - 1的逆来求解方程trans(A)Ax = trans(A)y得到x:x =(trans( A)A)^ - 1AY.

  • 如果您只需要Ax = y的解决方案,只需使用`permutation_matrix <size_t> pm(A.size1()); lu_factorize(A,pm); lu_substitute(A,pm,y);`和`y`被替换为解决方案. (10认同)

Deu*_*uro 5

线性求解器通常是LAPACK库的一部分,LAPACK库是BLAS库的更高级扩展.如果你在Linux上,那么英特尔MKL有一些很好的解算器,针对密集和稀疏矩阵进行了优化.如果你在窗户上,MKL可免费试用一个月......而且说实话,我还没有尝试过任何其他的试用版.我知道Atlas软件包有一个免费的LAPACK实现,但不确定在Windows上运行有多难.

无论如何,搜索适用于您的系统的LAPACK库.

  • 注意:LAPACK不是稀疏求解器,因此它不能非常有效地存储稀疏矩阵,也不能特别有效地解决稀疏系统.英特尔MKL确实包含稀疏求解器(http://software.intel.com/sites/products/collat​​eral/hpc/mkl/mkl_brief.pdf),特别是PARDISO直接稀疏求解器(http://www.pardiso-project) .org).有关密集和稀疏数值线性代数软件的详细信息,请访问http://www.netlib.org/utk/people/JackDongarra/la-sw.html (4认同)