7

我想解决线性方程组:

 Ax = b

A 是一个n x m矩阵(不是正方形),b 和 x 都是n x 1向量。在已知 A 和 b 的情况下,n 大约为 50-100,m 约为 2(换句话说,A 可能是最大值 [100x2])。

我知道解决方案x$x = \inv(A^T A) A^T b$

我找到了几种解决方法:uBLAS(Boost)、Lapack、Eigen 等,但我不知道使用这些包的“x”的 CPU 计算时间有多快。我也不知道这在数字上是否快速为什么要解决'x'

对我来说重要的是,由于我是新手,所以 CPU 计算时间会尽可能短并且有很好的文档。

在解决了正规方程后,Ax = b我想使用回归改进我的近似值,然后可能会应用卡尔曼滤波器。

我的问题是哪个 C++ 库对于我上面描述的需求更健壮和更快?

4

5 回答 5

7

uBlas 未经优化,除非您将其与优化的 BLAS 绑定一起使用。

以下针对多线程和 SIMD 进行了优化:

  1. 英特尔 MKL。带有 C 接口的 FORTRAN 库。不是免费的,但非常好。
  2. 本征。真正的 C++ 库。免费和开源。易于使用且良好。
  3. 阿特拉斯。FORTRAN 和 C. 免费和开源。不是 Windows 友好的,但在其他方面都很好。

顺便说一句,我不确切知道你在做什么,但通常正态方程不是进行线性回归的正确方法。除非您的矩阵条件良好,否则应首选 QR 或 SVD。

于 2011-01-03T14:04:37.677 回答
7

这是一个最小二乘解,因为你有比方程更多的未知数。如果 m 确实等于 2,这告诉我一个简单的线性最小二乘对你来说就足够了。公式可以写成封闭形式。你不需要图书馆。

如果 m 是个位数,我仍然会说您可以使用 A(transpose)*A*X = A(transpose)*b 轻松解决这个问题。求解系数的简单 LU 分解就足够了。这应该是一个比你想象的更直接的问题。

于 2011-01-03T14:17:26.463 回答
2

如果授权不是问题,您可以尝试 gnu 科学库

http://www.gnu.org/software/gsl/

它带有一个 blas 库,如果您以后需要,您可以将其换成优化的库(例如 intel、ATLAS 或 ACML(AMD 芯片)库。

于 2011-01-03T14:14:29.447 回答
1

如果您可以访问 MATLAB,我建议您使用它的 C 库。

于 2011-01-03T13:42:30.117 回答
-1

如果你真的需要专门化,你可以使用 Skilling 方法来近似矩阵求逆(到任意精度)。它仅使用阶 (N^2) 运算(而不是通常矩阵求逆的阶 N^3 - LU 分解等)。

它在链接到这里的 Gibbs 的论文中描述(大约第 27 页):

http://www.inference.phy.cam.ac.uk/mng10/GP/thesis.ps.gz

于 2011-01-03T14:24:32.593 回答