【问题标题】:Lapackpp vs Boost BLASLapackpp 与 Boost BLAS
【发布时间】:2011-01-01 19:52:51
【问题描述】:

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

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

我想解决:

Ax = y

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

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

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

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

谢谢

【问题讨论】:

  • 矩阵是密集的还是稀疏的,检查 uBlas 数字绑定,他们已经实现了许多绑定 AFAIK。既然你正在尝试使用 lapack,我认为矩阵是密集的......为什么我们那么奇怪 (A^T A)^{-1}A^T??
  • 所有元素都不同,然后为零,协方差指标应该是双倍 (2x2)。如果您能告诉我如何将数学方程式放入 stackoverflow,我会更乐意更改我的符号 (A^T A)^{-1}A^T)
  • (A^T A)^{-1}A^T 是 A 的 psudo-inverse。您可能希望使用库附带的 psudo-inverse 函数,而不是使用此公式计算它。
  • 你的硕士学位是什么学科?

标签: c++ boost linear-algebra linear-regression lapack++


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      你真的需要用 C++ 来实现吗?例如 python/numpy 会是你的替代品吗?对于递归回归(最小二乘),我建议查找 MIT 教授 Strang 的线性代数讲座和/或他的书籍。

      【讨论】:

        【解决方案4】:

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

        • solve(),求解线性方程组
        • pinv(),伪逆(内部使用 SVD)

        【讨论】:

          猜你喜欢
          • 2020-12-11
          • 2010-11-08
          • 1970-01-01
          • 1970-01-01
          • 2011-10-07
          • 2011-12-17
          • 2021-11-07
          • 1970-01-01
          相关资源
          最近更新 更多