我想求解线性方程的系统:

 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进行了优化:

  1. 英特尔MKL。 带有C接口的Fortran库。不是免费的,但是很好。
  2. 特征。 正确的C ++库。免费和开源。易于使用和良好。
  3. 地图集。 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页):

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top