优化方差计算,for循环太慢
Optimize variance calculation, for loop too slow
这是在此 link [
回答的问题的下一步
我必须为很多物种计算每行的特定公式。公式对应一个方差计算,所以需要上面link.
得到的结果
我当前的脚本包括使用自然非常慢的 for 循环。我在下面的脚本中简化了这个问题,使用一个简单的 df 称为 az
.
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
}
由于我必须对大量物种重复操作,我想知道是否有人有更有效的解决方案,也许使用矢量化表达式。
亲切的问候。
此代码将 return 与您的代码打印出的值相同,但效率更高。
> 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
这是在此 link [
我必须为很多物种计算每行的特定公式。公式对应一个方差计算,所以需要上面link.
得到的结果我当前的脚本包括使用自然非常慢的 for 循环。我在下面的脚本中简化了这个问题,使用一个简单的 df 称为 az
.
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
}
由于我必须对大量物种重复操作,我想知道是否有人有更有效的解决方案,也许使用矢量化表达式。
亲切的问候。
此代码将 return 与您的代码打印出的值相同,但效率更高。
> 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