【问题标题】:Optimize variance calculation, for loop too slow优化方差计算,for循环太慢
【发布时间】:2015-03-18 17:11:25
【问题描述】:

这是在此链接中回答的问题的下一步 [Apply function too slow in r

我必须为很多物种计算每行的特定公式。该公式对应一个方差计算,所以需要上面链接中得到的结果。

我当前的脚本包括使用自然非常慢的 for 循环。我使用名为az 的简单df 简化了以下脚本中的问题。

az=data.frame(c(1,2,10),c(2,4,20),c(3,6,30))
colnames(az)=c("a","b","c")

# Necessary number calculated in step 1 (see link above)
m <- as.matrix(az)
m[is.na(m)] <- 0 #remove NA from sums
step1 = as.vector(m %*% m[nrow(m),])

# Initial for loop
prov=0 # prov for provisional number
    for (i in 1:nrow(az)){
            for (j in 1:ncol(az)){
                   prov=prov+az[i,j]*az[nrow(az),j]
                   prov=prov+az[i,j]*(az[nrow(az),j]-step1[i])^2
            }
        print(prov)
        prov=0
        }

由于我必须对大量物种重复该操作,我想知道是否有人有更有效的解决方案,也许使用矢量化表达式。

亲切的问候。

【问题讨论】:

  • 代码优化问题应该在 CodeReview 上提问,而不是 StackOverflow codereview.stackexchange.com
  • @Hack-R 你有相关的元问题来支持这个说法吗?

标签: r for-loop


【解决方案1】:

此代码将返回与您的代码打印出的值相同的值,但效率更高。

> n<-nrow(m)
> mm<-t(m)
> prov<-mm*mm[,n]
> prov<-prov+mm*(mm[,n]-step1[col(mm)])^2
> colSums(prov)
[1]     82140    791480 113717400

【讨论】:

  • 它可以工作,只是代码行:prov&lt;-mm*mm[,n] 似乎没用。非常感谢换位想法!
猜你喜欢
  • 1970-01-01
  • 2016-01-01
  • 2020-09-09
  • 2019-02-12
  • 2020-10-22
  • 1970-01-01
  • 2019-09-27
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多