用C++求解正规方程组

Eag*_*gle 7 c++ boost linear-regression lapack++ eigen

我想解决线性方程组:

 Ax = b
Run Code Online (Sandbox Code Playgroud)

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

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

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

对我来说重要的是,由于我是新手,CPU计算时间尽可能短,文档也很好.

在求解正规方程后,Ax = b我想使用回归来改进我的近似,并且可能稍后应用卡尔曼滤波器.

我的问题是哪个C++库是robuster,并且我在上面描述的需求更快?

wat*_*180 7

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

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

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

顺便说一下,我不确切地知道你在做什么,但作为一项规则,正规方程式不是进行线性回归的正确方法.除非您的基质条件良好,否则应首选QR或SVD.


duf*_*ymo 7

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

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