叉积矩阵的迹 - 更快的计算方法?

8

我需要在R中快速计算矩阵A = B' C的迹(trace(A))。我能想到最快的方法如下:

set.seed(123)
n <- 10^6
B <- matrix(rnorm(n), ncol=sqrt(n))
C <- matrix(rnorm(n), ncol=sqrt(n))

ptm <- proc.time()
A <- tcrossprod(B,C)
traceA <- sum(diag(A))
proc.time() - ptm

我在思考是否有更快的方法来计算矩阵A(特别是当矩阵B和矩阵C对称或者幂等时)。我的意思是,通过行A <- tcrossprod(B,C)我正在计算整个矩阵A,但我只需要矩阵对角线元素的和(trace(A))。
为了加速这个过程,我想到了一个并行计算tcrossprod的方法,但我还没有找到实现这个方法的工具(此外,我不知道这是否是一个好主意)。有人有什么想法吗?
1个回答

12

Tr(B'C)就是将矩阵B和C视为向量进行内积运算的结果。

sum(B*C)

这个技巧在这个例子中起到了作用,并且比原来的方法快了几个数量级。


1
好的谢谢!我忘了提到,实际上矩阵A有一个递归计算。例如:A(k) = A(k-1) + crossprod(B,A(k-1))。并且我需要第k步中A(k)的迹。所以如果我使用你的建议:trace(A(k)) = sum(diag(A(k-1)) + sum(A(k-1)*B),但是没有完整的矩阵A(k-1),那么A(k)的迹无法计算,对吗?我想我需要编辑我的描述。 - Giuseppe
1
为了补充这个很好的答案,在更一般的情况下,如果B是大小为$N\times K$,C是$K \times N$,你需要使用sum(t(B) * C) - mbiron

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