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

时间:2009-08-04 01:50:30

标签: 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

6 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

当A很稀疏时,Ax = b的最佳解算器之一是Tim Davis的UMFPACK

UMFPACK计算A的稀疏LU分解。它是算法 当你输入x=A\b时,它会在Matlab的幕后使用(而A是稀疏的 和方形)。 UMFPACK是免费软件(GPL)

另请注意,如果y = Ax,并且x是已知的,但y不是,则通过执行稀疏矩阵向量乘法来计算y,而不是通过求解线性系统。

答案 3 :(得分:3)

阅读boost文档,似乎没有解决w.r.t x的实现。在y中求解只是矩阵向量积的问题,似乎在ublas中实现。

要记住的一件事是blas只实现了“简单”操作,如向量和矩阵类型的加法,乘法等。任何更高级的(线性问题解决,如你的“x y = A x中的求解”,特征向量和co)都是LAPACK的一部分,它建立在BLAS之上。我不知道在这方面提升了什么。

答案 4 :(得分:3)

Boost的线性代数包的调整集中在“密集矩阵”上。 据我所知,Boost的软件包没有任何线性系统求解器。 如何在“C(http://www.nr.com/oldverswitcher.html)中的数字配方”中使用源代码?

请注意。源代码中可能存在细微的索引错误(某些代码使用数组索引从1开始)

答案 5 :(得分:3)

看看JAMA/TNT。我只将它用于非稀疏矩阵(你可能想要QR或LU分解,两者都有求解器实用方法),但它显然有一些稀疏矩阵的功能。