我有以下代码:
Y.hat.tr <- array(0,c(nXtr,2))
for (i in 1:nXtr){
#print(i)
Y.hat.tr[i,2] <- ktr[,i]%*%solve(K + a*In)%*%Ytr
#Y.hat.tr[i,2] <- ktr[,i]%*%chol2inv(chol((K + a*In)))%*%Ytr
}
Y.hat.tr[,1] <- Ytr
我的问题是nXtr = 300,而ktr是300x300矩阵。此例程在R版本3.0.1中运行大约需要30秒。我尝试了各种方法来减少运行时间,但无济于事。
任何想法都会感激不尽。如果需要任何其他信息,请告诉我
我现在把解决(K + a * In)%*%Ytr从循环中取出,这有所帮助,但我希望以某种方式将这段代码矢量化。经过一段时间的思考,并在查看了各种帖子后,我看不出这是怎么做到的?
答案 0 :(得分:1)
也许我错过了一些东西(并且没有样本或模拟数据来测试它更难检查),但是你的循环不等于:
Y.hat.tr[,2] <- t(ktr) %*% solve(K + a*In) %*% Ytr
完全删除循环并使用内部矢量化代码可能会加快速度。
此外,您正在使用带有1个参数的solve
,通常可以通过使用带有2个参数的求解(更少的内部计算)来加快速度,例如:
t(ktr) %*% solve( K + a*In, Ytr )
您的循环属于令人尴尬的并行类型,这意味着如果您想保留循环并且正在使用具有1个以上核心的计算机(或者可以轻松访问群集),那么您可以使用并行包(也许最简单的方法是使用foreach包进行转换)并行运行计算,这有时可以大大加快过程。