在C ++中求解正常方程式系统
-
14-10-2019 - |
题
我想求解线性方程的系统:
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$
我找到了几种解决方法的方法:UBLA(Boost),Lapack,Eigen等。但是我不知道使用这些软件包的CPU计算时间的速度有多快。我也不知道这是否在数字上是快速解决'x'的快速
我重要的是,自从我是新手以来,CPU计算时间将尽可能短,而且文档良好。
求解正常方程后 Ax = b
我想使用回归和 也许以后 应用卡尔曼过滤器。
我的问题是,哪个C ++库是我上面描述的需求的更快,更快的?
解决方案
这是最小二乘解决方案,因为您比方程式更多。如果M确实等于2,那就告诉我一个简单的线性最小二乘将足以适合您。公式可以以封闭形式写出。您不需要图书馆。
如果m是单位数字,我仍然会说您可以使用(transpose)*a*x = a(transpose)*b轻松解决此问题。一个简单的LU分解来求解系数就足够了。这应该比您提出的要简单得多。
其他提示
除非您将其与优化的Blas绑定一起使用,否则不优化UBLA。
以下针对多线程和SIMD进行了优化:
- 英特尔MKL。 带有C接口的Fortran库。不是免费的,但是很好。
- 特征。 正确的C ++库。免费和开源。易于使用和良好。
- 地图集。 Fortran和C.免费和开源。不友好,但不错。
顺便说一句,我不知道您在做什么,但是通常,普通方程不是进行线性回归的正确方法。除非您的矩阵条件良好,否则应优选QR或SVD。
如果Liscencing不是问题,您可以尝试GNU科学库
http://www.gnu.org/software/gsl/
它带有一个BLAS库,如果需要以后进行优化的库(例如Intel,Atlas或ACML(AMD芯片)库),则可以将其交换为优化的库。
如果您可以访问MATLAB,我建议使用其C库。
如果您真的需要专业化,则可以使用Skilling方法近似(任意精度)近似矩阵倒置。它仅使用顺序(n^2)操作(而不是通常的矩阵倒置n^3顺序 - lu分解等)。
它在此处链接到这里的吉布斯的论文中描述了它(第27页):