设$A$是一个$m \times n$矩阵,不一定对称,$D$是一个对角$n \times n$矩阵。在我的问题中,$m $〈$n$,但是$m$和$n$都有可能非常大,所以$ADA^T$的计算可能需要几秒钟,因为维度非常高。我正在编写的程序将对$A$和$D$的不同变体执行多次这种计算,因此我想找到一种方法来加速它,因为这可以在脚本过程中保存几分钟。
目前,我正在做tcrossprod(A %*% D, A)
。但是我觉得应该有一种更快的方法来计算它,因为$D$是一个对角矩阵。从代数或计算的Angular 来看,有没有人在这里看到任何好的捷径?
2条答案
按热度按时间iszxjhcz1#
只是为了枚举
tcrossprod
底层C代码所采用的不同路径。..对于密集
A
,隐式类matrix
:如果
D
是非负的,那么你可以得到BLAS例程DSYRK
,它利用了对称性:否则,您将被BLAS例程
DGEMM
卡住:如果您知道
A
和D
是有限的,不包含IEEE特殊值Inf
或NaN
(包括R的NA_real_
),则可以使用外部BLAS进行实验。如果R检测到任一矩阵因子是非有限的,则R将不使用外部BLAS。对于形式类
dgCMatrix
的稀疏A
:如果
D
是非负的,那么你可以得到CHOLMOD例程cholmod_aat
,它利用了对称性,如下所示:否则,你会被CHOLMOD例程
cholmod_transpose
和cholmod_ssmult
卡住:在任何情况下,因为
D
是对角的,你应该只需要一个矩阵相乘。lxkprmvk2#
以下是几种可能实现的基准测试示例,其中
D
的对角线项可能为负(因此as.complex
用于f4
和f5
)等着瞧吧