快速交叉積我有一個矩陣A中的遞歸運算(這將是一個帽型矩陣),例如:遞歸矩陣
A(i) = A(i-1) + crossprod(B,A(i-1))
對於每個步驟i
我需要的A(i)
的跡線。有R中實現這個比下面的實現更快的方法:
# 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是對稱的和冪(因爲他們是一頂帽子矩陣線性模型)並且可能非常大。我猜這個並行計算會失敗,因爲for循環需要之前步驟的矩陣A(i-1)。
這背後的想法是一個基於似然的增強算法,其中我需要可以像上面提到的那樣計算的每個增強迭代的帽子矩陣的軌跡。
搜索有關ATLAS Rblas庫作爲從默認庫切換可以顯着提高矩陣乘法的性能。 – flodel
你關心'Amat'嗎?如果您只需要存儲跟蹤,則可以利用關於跟蹤的兩個重要結果(https://en.wikipedia.org/wiki/Trace_ (linear_algebra))。第一個是「trace(A + B)= trace(A)+ trace(B)'。第二個是trace(X'Y)= sum(as.vector(X)* as.vector(Y))'。 – flodel
@ flodel,是否有理由在這裏強制使用'as.vector',因爲'*'是矩陣的哈達瑪產品? –