首页 文章

BLAS矩阵通过矩阵转置乘法

提问于
浏览
4

我必须以 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 ?谢谢!

2 回答

  • 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矩阵,第二种情况下是a乘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 ** TA,其中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

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

相关问题