boost有吗?其中 A、y 和 x 分别是矩阵(稀疏且可能非常大)和向量。y 或 x 都可以是未知的。
我似乎在这里找不到它:http: //www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm
boost有吗?其中 A、y 和 x 分别是矩阵(稀疏且可能非常大)和向量。y 或 x 都可以是未知的。
我似乎在这里找不到它:http: //www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm
是的,您可以使用 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 = (trans( A)A)^-1Ay。
线性求解器通常是 LAPACK 库的一部分,LAPACK 库是 BLAS 库的更高级别扩展。如果您使用的是 Linux,英特尔 MKL 有一些很好的求解器,针对密集和稀疏矩阵进行了优化。如果你在 Windows 上,MKL 有一个月的免费试用期......老实说,我还没有尝试过其他任何一个。我知道 Atlas 包有一个免费的 LAPACK 实现,但不确定在 Windows 上运行有多难。
不管怎样,到处搜索一个可以在你的系统上运行的 LAPACK 库。
当 A 稀疏时,Ax = b 的最佳求解器之一是 Tim Davis 的UMFPACK
UMFPACK
计算 A 的稀疏 LU 分解。这是在您键入时在 Matlab 中使用的算法x=A\b
(并且 A 是稀疏和方形的)。 UMFPACK
是免费软件 (GPL)
另请注意,如果 y=Ax,并且 x 是已知的,但 y 不是,则通过执行稀疏矩阵向量乘法而不是通过求解线性系统来计算 y。
看看JAMA/TNT。我只将它用于非稀疏矩阵(您可能需要 QR 或 LU 分解,它们都有求解器实用方法),但它显然有一些稀疏矩阵的工具。
阅读 boost 文档,似乎并没有实现解决 wrt x 的问题。求解 y 只是矩阵向量积的问题,这似乎在 ublas 中实现。
要记住的一件事是 blas 只实现向量和矩阵类型的“简单”操作,如加法、乘法等。任何更高级的(线性问题解决,比如你的“解决 xy = A x”、特征向量和 co)都是 LAPACK 的一部分,它建立在 BLAS 之上。我不知道提升在这方面提供了什么。
Boost 的线性代数包的调优专注于“密集矩阵”。据我所知,Boost 的软件包没有任何线性系统求解器。在“C 中的数值配方 ( http://www.nr.com/oldverswitcher.html )”中使用源代码怎么样?
笔记。源代码中可能存在细微的索引错误(某些代码使用从 1 开始的数组索引)