BLAS矩阵通过矩阵转置乘法

时间:2017-10-30 10:58:51

标签: matrix linear-algebra blas

我必须以A'A或更一般A'DA的形式计算某些产品,其中A是一般的mxn矩阵,D是对角线mxm矩阵。两者都是满级;即。rank(A)=min(m,n)

我知道你可以节省大量时间就是这样的对称产品:假设A'A是对称的,你只需要计算产品矩阵的下 - 或 - 上 - 对角线部分。这会增加要计算的n(n+1)/2个条目,大约是大型矩阵的典型n^2的一半。

这是一个很好的保存,我想利用,我知道我可以在for循环内实现矩阵 - 矩阵乘法。但是,到目前为止,我一直在使用BLAS,它比我自己编写的任何for循环实现快得多,因为它优化了缓存和内存管理。

有没有办法使用BLAS有效地计算A'A甚至A'DA? 谢谢!

3 个答案:

答案 0 :(得分:5)

您正在寻找BLAS的dsyrk子程序。

如文档中所述:

  

SUBROUTINE dsyrk(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)

     

DSYRK执行对称秩k操作之一

     

C := alpha*A*A**T + beta*C

     

     

C := alpha*A**T*A + beta*C

     

其中alpha和beta是标量,C是n×n对称矩阵,A是第一种情况下的n乘k矩阵,第二种情况下是k乘n矩阵。

A'A存储上三角形的情况下:

CALL dsyrk( 'U' , 'T' ,  N , M ,  1.0  , A , M , 0.0 , C , N )

对于A'DA,BLAS中没有直接的等价物。但是,您可以在for循环中使用dsyr

  

SUBROUTINE dsyr(UPLO,N,ALPHA,X,INCX,A,LDA)

     

DSYR执行对称秩1操作

     

A := alpha*x*x**T + A

     

其中alpha是实数标量,x是n元素向量,A是n×n对称矩阵。

do i = 1, M
    call dsyr('U',N,D(i,i),A(1,i),M,C,N)
end do

答案 1 :(得分:1)

@ztik建议的BLAS中的dsyrk例程是A'A的例程。对于A'DA,一种可能性是使用dsyr2k例程,该例程可以执行对称等级2k运算:

C := alpha*A**T*B + alpha*B**T*A + beta*C.

设置alpha = 0.5, beta = 0.0,然后让B = DA。请注意,这种方式假设对角矩阵D是真实的。

答案 2 :(得分:-1)

SYRK适用于A'A。对于A'DA,你可以在它的一侧使用SYMM,例如V = A'D然后使用英特尔MKL的GEMMT用于W = V A. GEMMT就像GEMM,除了它利用了结果矩阵是对称的这一事实,并且因此只需做大约一半的工作。