r - 如何加速这种双 for 循环?

标签 r performance for-loop vectorization expectation-maximization

我正在编程 expectation-maximization algorithm使用 R。为了加快计算速度,我想对这个瓶颈进行矢量化。我知道 N 大约是 k 的一百倍。

MyLoglik = 0
for (i in c(1:N))
{
 for (j in c(1:k))
 {
  MyLoglik = MyLoglik + MyTau[i,j]*log(MyP[j]*MyF(MyD[i,], MyMu[j,], MyS[[j]]))
 }
}

还有这个矩阵列表:

MyDf.list <- vector("list", k)
for(i in 1:k)
{
 MyDf.list[[i]] <- matrix(0,d,d)
 for (j in c(1:N))
 {
  MyDf.list[[i]] = MyDf.list[[i]] + MyTau[j,i]*as.numeric((MyD[j,]-MyMu[i,])) %*% t(as.numeric(MyD[j,]-MyMu[i,]))  
 }
 MyDf.list[[i]] = MyDf.list[[i]] / MyM[i]
}

我使用以下方法加快了速度:

MyLoglik = 0
for (j in c(1:k))
{
 MyR= apply(MyD, 1, function(x) log(MyP[j]*MyF(x, MyMu[j,], MyS[[j]])))
 MyLoglik = MyLoglik + sum(MyTau[,j]*MyR)
}

和:

d = dim(MyD)[2]
MyDf.list <- vector("list", k)
for(i in 1:k)
{
 MyDf.list[[i]] <- matrix(0,d,d)
 MyR= apply(MyD, 1, function(x) as.numeric((x-MyMu[i,])) %*% t(as.numeric(x-MyMu[i,])))
 MyDf.list[[i]] = matrix(rowSums(t(MyTau[,i]*t(MyR))) / MyM[i],d,d)
}

最佳答案

对于第一个,我假设 MyF 是您创建的函数?如果您可以确保它将您的矩阵和列表作为输入并输出一个矩阵,您可以执行以下操作:

MyLoglik = sum(MyTau%*%log(MyP)) + sum(MyTau*log(MyF(MyD, MyMu, MyS)))

对于第二个,我认为由于您将其作为列表进行,因此矢量化将更加困难。也许你可以有一个 3 维数组而不是矩阵列表?这样 MyDf.array[i,j,k] 的维度为 N, d, d(或 d, d, N)。

关于r - 如何加速这种双 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4248790/

相关文章:

r - Redshift 上 Shiny 缓慢

c++ - (最好是提升)无锁数组/vector/ map /等?

javascript - For 循环没有按预期工作(使用 jQuery)

r - ggplot2 热图,图表之间具有固定比例的颜色条

r - 使用 tidyverse + sf R 创建每个多边形的线密度

java - 频繁 Integer.toString() 转换的内存问题

java - 我的 for 循环不会重新运行 in.nextLine 的输入?

c# - 嵌套数组循环迭代

r - 如何用向量运算替换双 for 循环

performance - 使用具有静态函数的类与实例化类之间的性能差异很大吗?