首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归矩阵的快速交叉积

递归矩阵的快速交叉积
EN

Stack Overflow用户
提问于 2013-07-30 16:42:16
回答 1查看 579关注 0票数 3

我有一个矩阵A的递归计算(这将是一个帽子矩阵),例如:

A(i) = A(i-1) + crossprod(B,A(i-1))

对于每一步i,我都需要A(i)的跟踪。在R中是否有比以下实现更快的实现方法:

代码语言:javascript
复制
# define random matrices
set.seed(123)
n <- 7^2*10^4
steps <- 10
A <- matrix(rnorm(n), ncol=sqrt(n))
B <- matrix(rnorm(n), ncol=sqrt(n))

# preallocation
Amat <- traceA <- vector("list", steps)
Amat[[1]] <- A

# recursive computation for matrix A(i)
ptm <- proc.time()
for(i in 2:steps){
  Amat[[i]] <- Amat[[i-1]] + crossprod(B,Amat[[i-1]])
  traceA[[i]] <- sum(diag(Amat[[i]]))
}
proc.time() - ptm

我想提到的是,矩阵A(i)和矩阵B是对称的和幂等的(因为它们是线性模型的hat矩阵),并且可以是非常大的。我想并行计算在这里会失败,因为for-循环需要前面步骤的矩阵A(i-1)。

这背后的想法是一种基于似然的增强算法,在这里,我需要追踪帽子矩阵的每一次提升迭代,就像上面提到的那样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-30 17:05:50

看起来你的Amat_i可以写成Amat_i = (1+t(B))^(i-1) * A,既然你提到了B*B = Bt(B)*t(B) = t(B),那么

代码语言:javascript
复制
 (1+B)^n = 1 + choose(n,1)*B + choose(n,2)*B^2 + ...
         = 1 + B * (choose(n,1) + choose(n,2) + ... + choose(n,n))
         = 1 + B * (2^n - 1)

然后把所有的都放在一起:

代码语言:javascript
复制
 tr(Amat_i) = tr(A) + (2^(i-1) - 1) * tr(t(B)*A)

所以,只要计算出这两条轨迹,你就不需要再做任何矩阵乘法来得到所有的tr(Amat_i)了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17952754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档