我必须以 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 回答
你正在寻找BLAS的
dsyrk
子程序 .如文档中所述:
在
A'A
存储上三角形的情况下:对于
A'DA
,在BLAS中没有直接的等价物 . 但是,您可以在for循环中使用dsyr
.SYRK适合A'A . 对于A'DA,你可以在它的一侧使用SYMM,例如V = A'D然后使用英特尔MKL的GEMMT用于W = V A. GEMMT就像GEMM,除了它利用了结果矩阵是对称的这一事实,并且因此只需做大约一半的工作 .