我想解决线性方程组:
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,并且我的上述需求更快?
答案 0 :(得分:7)
除非您使用优化的BLAS绑定,否则uBlas不会进行优化。
以下针对多线程和SIMD进行了优化:
答案 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页左右):