感谢 BLAS,我想用 C 语言实现一些快速操作(没有机会选择另一个库,它是我项目中唯一可用的库)。我执行以下操作:
- 反转方阵,
- 制作矩阵乘积 A*B,其中 A 是计算的逆矩阵,B 是向量,
- 将两个(非常长的)向量相加。
我听说使用 BLAS 可以进行这种操作,而且速度非常快。但是我搜索并没有发现任何可以让我理解和应用它的东西(我的意思是在 C 代码行中)。
感谢 BLAS,我想用 C 语言实现一些快速操作(没有机会选择另一个库,它是我项目中唯一可用的库)。我执行以下操作:
我听说使用 BLAS 可以进行这种操作,而且速度非常快。但是我搜索并没有发现任何可以让我理解和应用它的东西(我的意思是在 C 代码行中)。
BLAS 库最初是用 Fortran 编写的。C 的接口称为 CBLAS,所有函数都以 . 为前缀cblas_
。
不幸的是,对于 BLAS,您只能直接解决最后两点:
sgemv
(单精度)或dgemv
(双精度)执行矩阵向量乘法saxpy
(单精度) 或daxpy
(双精度) 执行一般向量-向量加法BLAS 不处理更复杂的矩阵求逆运算。为此,有基于 BLAS 并提供线性代数运算的 LAPACK 库。LAPACK 中的一般矩阵求逆是使用sgetri
(单精度)或dgetri
(双精度)完成的,但还有其他处理特定情况的求逆例程,如对称矩阵。如果您反转矩阵只是为了稍后将它乘以一个向量,那本质上是求解一个线性方程组,并且有sgesv
(单精度)和dgesv
(双精度)。
您只能通过本质上(重新)实现 LAPACK 例程之一来使用 BLAS 操作来反转矩阵。
你真的需要计算完整的逆吗?这很少需要,非常昂贵且容易出错。
计算逆乘以向量或矩阵更为常见。这是很常见的,相当便宜,而且不容易出错。您无需计算倒数即可将其乘以向量。
如果您想计算 Z = X^-1Y 那么您应该查看LAPACK 驱动程序例程。在这种情况下,通常 Y 只有几列。如果您确实需要查看所有 X^-1,则可以将 Y 设置为完整标识。
从技术上讲,您可以按照您的要求做,但通常这样做更稳定:
BLAS 非常有能力做到这一点。从技术上讲,它在“LAPACK”中,但大多数/许多 BLAS 实现都包括 LAPACK,例如 OpenBLAS 和英特尔的 MKL 都这样做。
dgetrf
("(d)ouble, (ge)neral matrix, (tr)iangular (f)actorization") http://www.netlib.org/lapack/double/dgetrf.fdtrsm
("(d)ouble (tr)iangular (s)olve (m)atrix") http://www.netlib.org/blas/dtrsm.f请注意,要从 C 调用这些,请注意:
_
后缀,即dgetrf_
和dtrsm_
int *m
和double *a