如何使用BLAS进行向量-矩阵乘法?

8

BLAS定义了GEMV(矩阵-向量乘法)二级运算。如何使用BLAS库执行向量-矩阵乘法?

这可能是显而易见的,但我不知道如何使用BLAS操作进行此乘法。我本来期望有一个GEVM操作。


5
转置(x)。转置(A) = A.x - talonmies
1个回答

11
一个(M x N)矩阵与一个(N x 1)向量的矩阵向量乘法将得到一个(M x 1)向量。简而言之,a*A(MxN)*X(Nx1) + b*Y(Mx1) -> Y(Mx1)。当向量包含在矩阵中时,当然可以使用INCXINCY
为了定义向量-矩阵乘法,向量应该被转置。即 a*X(1xM)*A(MxN) + b*Y(1xN) -> Y(1xN)。基本上,你没有一个向量,而是一个单行矩阵。
从这一点出发,有两种可能性。
要么使用三级“GEMM”
?gemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)

使用

?gemm('N', 'N', 1, N, M, a, X, 1, A, M, b, Y, 1)

或者进行更多的数学计算。考虑到 (X*A)^T = A^T * X^T,行矩阵 X 被转换成向量 X^T(MX1)。同样地,Y 转置为向量 Y^T(Nx1)。当然,就内存而言,XX^T 以相同的方式顺序存储。这意味着您可以再次使用转置矩阵 A 进行 GEMV

?gemv('T', M, N, a, A, M, X, 1, b, Y, 1)

感谢您的解释和精确的示例,它运行良好 :) - Baptiste Wicht
1
我尝试了两种方法。但是?gemm?gemv快2~3倍。?gemv不应该总是比?gemm快吗? - mintaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接