【问题标题】:BLAS : Matrix product in C?BLAS:C 中的矩阵乘积?
【发布时间】:2025-12-20 15:45:06
【问题描述】:

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

  • 反转方阵,
  • 制作矩阵乘积 A*B,其中 A 是计算的逆矩阵,B 是向量,
  • 将两个(非常长的)向量相加。

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

【问题讨论】:

  • BLAS 不包括任何矩阵求逆例程。但你到底要问什么?我在任何地方都没有看到可以回答的问题。
  • 你好 talonmies。对不起,如果我不能很好地表达自己,我是法国人。无论如何,最重要的是第二个操作:在 C 中用 BLAS 制作矩阵乘积,但我找不到任何方法。
  • 非常很惊讶您找不到任何东西。当我用 google 搜索“C BLAS”时,我从 Netlib、GNU 科学库和 Intel 获得了许多非常有用的 C BLAS 接口文档链接。您使用的是哪个 BLAS 库?

标签: c performance matrix product blas


【解决方案1】:

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

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

  • sgemv(单精度)或dgemv(双精度)执行矩阵向量乘法
  • saxpy(单精度)或daxpy(双精度)执行一般向量-向量加法

BLAS 不处理更复杂的矩阵求逆运算。为此,有基于 BLAS 并提供线性代数运算的 LAPACK 库。 LAPACK 中的一般矩阵求逆是使用sgetri(单精度)或dgetri(双精度)完成的,但还有其他处理特定情况的求逆例程,如对称矩阵。如果您只是为了稍后将矩阵与向量相乘而反转矩阵,那实际上是在求解一个线性方程组,为此有sgesv(单精度)和dgesv(双精度)。

您只能通过本质上(重新)实现 LAPACK 例程之一来使用 BLAS 运算来反转矩阵。

有关更多详细信息和示例,请参阅众多 BLAS/LAPACK 实现之一,例如Intel MKLATLAS

【讨论】:

  • 感谢您的帮助。有一个问题:我必须在只知道'-lblas'而不知道'-lcblas'的服务器上编译我的工作。我找到了一些等价物(例如 BLAS_dgemv,而不是 cblas_dgemv)。我做了一个#include,但服务器找不到它。有什么帮助吗?我忘了什么吗?我可以找到关于 cblas_ 的信息,但关于 blas_ 的信息很少......
  • 如果 BLAS 作为系统范围的库安装,请在 /usr/include 中搜索 *blas*.h。可能只有运行时库没有开发头文件。
【解决方案2】:

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

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

如果您想计算 Z = X^-1Y,那么您应该查看LAPACK driver routines。在这种情况下,通常 Y 只有几列。如果您确实需要查看所有 X^-1,则可以将 Y 设置为完整标识。

【讨论】:

    【解决方案3】:

    从技术上讲,您可以按照您的要求做,但通常这样做更稳定:

    • 三角分解,例如 LU 分解或 Cholesky 分解
    • 对分解矩阵使用三角求解器

    BLAS 完全有能力做到这一点。从技术上讲,它在“LAPACK”中,但大多数/许多 BLAS 实现都包含 LAPACK,例如 OpenBLAS 和英特尔的 MKL 都包含。

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

    • 函数名应为小写,后缀为_,即dgetrf_dtrsm_
    • 所有参数都应该是指针,例如int *mdouble *a

    【讨论】: