用C ++求解正规方程组

时间:2011-01-03 13:38:15

标签: c++ boost linear-regression eigen lapack++

我想解决线性方程组:

 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 ++库是robuster,并且我的上述需求更快?

5 个答案:

答案 0 :(得分:7)

除非您使用优化的BLAS绑定,否则uBlas不会进行优化。

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

  1. 英特尔MKL。带有C接口的FORTRAN库。不是免费但非常好。
  2. Eigen。真正的C ++库。免费和开源。易于使用和良好。
  3. Atlas。 FORTRAN和C.免费开源。不是Windows友好的,但其他方面都很好。
  4. 顺便说一句,我不确切地知道你在做什么,但作为一项规则,正规方程不是进行线性回归的正确方法。除非您的基质条件良好,否则应首选QR或SVD。

答案 1 :(得分:7)

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

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

答案 2 :(得分:2)

如果liscencing不是问题,您可以尝试使用gnu科学库

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

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

在Gibbs的论文中描述了它(在第27页左右):

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