R中的矩阵乘法(非常慢)

时间:2014-07-23 19:31:11

标签: r matrix multiplication

我有以下代码:

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从循环中取出,这有所帮助,但我希望以某种方式将这段代码矢量化。经过一段时间的思考,并在查看了各种帖子后,我看不出这是怎么做到的?

1 个答案:

答案 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包进行转换)并行运行计算,这有时可以大大加快过程。