提升有一个吗? 其中A,y和x分别是矩阵(稀疏且可以非常大)和向量。 y或x都可能是未知的。
我似乎无法在这里找到它: http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm
答案 0 :(得分:18)
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分解,两者都有求解器实用方法),但它显然有一些稀疏矩阵的功能。