2

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

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

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

4

3 回答 3

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

于 2012-05-13T16:50:05.663 回答
1

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

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

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

于 2012-08-16T16:19:38.333 回答
1

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

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

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

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

  • 函数名应为小写,带_后缀,即dgetrf_dtrsm_
  • 所有参数都应该是指针,例如int *mdouble *a
于 2013-06-24T15:37:30.980 回答