首页 文章

BLAS:C中的Matrix产品?

提问于
浏览
1

感谢BLAS,我想用C语言实现一些快速操作(没有机会选择另一个库,它是我项目中唯一可用的库) . 我做了以下操作:

  • 反转方阵,

  • 制作矩阵乘积A * B,其中A是计算的逆矩阵,B是矢量,

  • 求和两个(非常长)向量 .

我听说BLAS可以进行这种操作并且非常快 . 但我搜索并发现没有任何东西(在C代码行中,我的意思),这可以让我理解并应用它 .

3 回答

  • 1

    从技术上讲,你可以做你想要的,但通常做得更稳定:

    • 三角分解,例如LU分解或Cholesky分解

    • 在分解矩阵上使用三角形求解器

    BLAS非常有能力做到这一点 . 从技术上讲,它处于'LAPACK',但大多数/许多BLAS实现包括LAPACK,例如OpenBLAS和Intel的MKL都可以 .

    请注意,要从C调用这些,请注意:

    • 函数名称应为小写,后缀为 _ ,即 dgetrf_dtrsm_

    • 所有参数都应该是指针,例如 int *mdouble *a

  • 5

    BLAS库最初是在Fortran中编写的 . C的接口称为CBLAS,所有函数都以 cblas_ 为前缀 .

    不幸的是,BLAS你只能直接解决最后两点:

    • sgemv (单精度)或 dgemv (双精度)执行矩阵向量乘法

    • saxpy (单精度)或 daxpy (双精度)执行一般矢量矢量加法

    BLAS不处理反转矩阵的更复杂操作 . 为此,有一个基于BLAS构建的LAPACK库,并提供线性代数操作 . LAPACK中的一般矩阵求逆使用 sgetri (单精度)或 dgetri (双精度)完成,但还有其他反转例程可处理特定情况,如对称矩阵 . 如果你反转矩阵只是为了稍后将它乘以一个向量,那基本上是求解一个线性方程组,并且有 sgesv (单精度)和 dgesv (双精度) .

    您只能通过基本上(重新)实现其中一个LAPACK例程来使用BLAS操作来反转矩阵 .

    有关更多详细信息和示例,请参阅许多BLAS / LAPACK实现中的一个,例如Intel MKLATLAS .

  • 1

    你真的需要计算完整的倒数吗?这很少需要,非常昂贵且容易出错 .

    计算逆乘以矢量或矩阵更为常见 . 这是非常常见的,相当便宜,而且不容易出错 . 您不需要计算逆以将其乘以向量 .

    如果你想计算Z = X ^ -1Y那么你应该看LAPACK driver routines . 通常在这种情况下Y只有几列 . 如果你真的需要看到所有的X ^ -1,那么你可以将Y设置为完整的身份 .

相关问题