4

首先,我是 C++ 的新手。

我正在为我的硕士论文编写一个程序,其中的一部分假设以递归方式解决回归。

我想解决:

Ax = y

在我的情况下,计算速度是不可忽视的,这就是我想知道 Boost::BLAS 是否使用

x = (A^T A)^{-1}A^Ty

将需要比 Lapackpp 更少的计算时间(我使用的是 gentoo)。

PS 我可以在 Lapackpp 项目站点 Class 文档中找到,但没有示例。有人可以给我一些例子,以防 Lapack 比 Boost::BLAS 更快

谢谢

4

4 回答 4

4

从数值分析的角度来看,你永远不想编写代码

  • 显式反转矩阵,或
  • A^T A形成回归的正规方程 ( ) 矩阵

与直接解决相同问题的替代方案相比,这两者的工作量更大,准确性更低(并且可能更不稳定)。

每当您看到一些显示矩阵求逆的数学时,应将其理解为“求解线性方程组”,或分解矩阵并使用分解来求解系统。BLAS 和 Lapack 都有执行此操作的例程。

同样,对于回归,调用计算回归的库函数,或阅读如何自己做。正规方程方法是教科书错误的方法

于 2011-01-20T22:47:22.063 回答
2

高级界面和低级优化是两个不同的东西。

LAPACK 和 uBLAS 提供高级接口和未优化的低级实现。硬件优化的低级例程(或绑定)应该来自其他地方。一旦提供了绑定,LAPACK 和 uBLAS 就可以使用优化的低级例程,而不是它们自己的未优化实现。

例如,ATLAS 提供优化的低级例程,但只提供有限的高级(3 级 BLAS 等)接口。您可以将 ATLAS 绑定到 LAPACK。然后 LAPACK 将使用 ATLAS 进行低级工作。将 LAPACK 视为将技术工作委派给经验丰富的工程师 (ATLAS) 的高级经理。uBLAS 也是如此。您可以绑定 uBLAS 和 MKL。结果将是优化的 C++ 库。检查文档并使用谷歌找出如何去做。

于 2011-01-03T18:48:38.303 回答
2

Armadillo将 BLAS 和 LAPACK 包装在一个漂亮的 C++ 接口中,并提供以下与您的问题直接相关的类似 Matlab 的函数:

  • solve(),求解线性方程组
  • pinv(),伪逆(内部使用 SVD)
于 2012-12-18T09:42:32.427 回答
2

你真的需要用 C++ 来实现吗?例如 python/numpy 会是你的替代品吗?对于递归回归(最小二乘),我建议寻找麻省理工学院教授斯特朗关于线性代数的讲座和/或他的书。

于 2011-01-20T20:55:45.343 回答