提高R脚本效率

  • 本文关键字:效率 脚本 提高
  • 更新时间 :
  • 英文 :


我试图写一个R脚本,作为第一步,计算输入矩阵的每一行的dist()和其他东西,然后,作为脚本的第二步,使用步骤1中获得的每对输出矩阵进行另一次计算。我的问题是,我不能"保存"从第一步获得的所有矩阵。有人能告诉我一个好的策略吗?

我的代码是这样的:

n<- nrow (aa)
output <- matrix (0, n, n)
for (i in 1:n)
{
    for (j in i:n)
    {
        akl<- function (dii){
            ddi<- as.matrix (dii)
            m<- rowMeans(ddi)
            M<- mean(ddi)
            r<- sweep (ddi, 1, m)
            b<- sweep (r, 2, m)
            return (b + M)  
            }
        A<- akl(dist(aa[i,]))
        B<- akl(dist(aa[j,]))
            V <- sqrt ((sqrt (mean(A * A))) * (sqrt(mean(B * B))))
        if (V > 0) {
            output[i,j] <- (sqrt(mean(A * B))) / V else output[i,j] <- 0
            }
    }
}   

我想从akl函数中获得所有结果矩阵,然后将它们用于其余的计算。我在这里展示的脚本在时间上是非常昂贵的因为它每次都要计算akl对于大的输入矩阵是一个问题

你不需要在j循环中重新计算A,把它放在外面。

同样,你不需要每次都在循环内重新定义函数(假设它不依赖于循环内的任何东西)。

n<- nrow (aa)
output <- matrix (0, n, n)
akl<- function (dii){
            ddi<- as.matrix (dii)
            m<- rowMeans(ddi)
            M<- mean(ddi)
            r<- sweep (ddi, 1, m)
            b<- sweep (r, 2, m)
            return (b + M)  
            }
for (i in 1:n)
{
    A<- akl(dist(aa[i,]))
    for (j in i:n)
    {
        B<- akl(dist(aa[j,]))
            V <- sqrt ((sqrt (mean(A * A))) * (sqrt(mean(B * B))))
        if (V > 0) {
            output[i,j] <- (sqrt(mean(A * B))) / V else output[i,j] <- 0
            }
    }
}   

试试,运行你的测试(你写过测试,对吧?),看看。

现在您已经对代码进行了改进,请查看编译器包。通过使用编译器与enablejit(3),您可以节省一些时间的脚本有很多循环。

最新更新