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