你好,我有一个在R中需要优化性能的函数。我需要向量化for循环。我的问题在于略微复杂的数据结构以及使用“which”命令执行查找的方式。
假设我们正在处理5个元素(1,2,3,4,5),10x2矩阵对是所有唯一对5个元素的组合(即(1,2),(1,3),(1,4)....(4,5))。all_prods是一个10x1的矩阵,我需要在迭代所有5个元素时使用这些对进行查找。
因此,对于1,我需要从all_prods中索引第1、2、3、4行(即对1,2 1,3 1,4和1,5)等等,对于1、2、3、4、5都是如此。
我最近才从matlab转到R,所以非常希望得到任何帮助。
foo <- function(AA , BB , CC ){
pa <- AA*CC;
pairs <- t(combn(seq_len(length(AA)),2));
all_prods <- pa[pairs[,1]] * pa[pairs[,2]];
result <- matrix(0,1,length(AA));
# WANT TO VECTORIZE THIS BLOCK
for(st in seq(from=1,to=length(AA))){
result[st] <- sum(all_prods[c(which(pairs[,1]==st), which(pairs[,2]==st))])*BB[st];
}
return(result);
}
AA <- seq(from=1,to=5); BB<-seq(from=11,to=15); CC<-seq(from=21,to=25);
results <- foo(AA,BB,CC);
#final results is [7715 164208 256542 348096 431250]
我希望将for循环转换为向量化版本。不需要遍历每个元素st,我想用一个命令完成它并给我一个结果向量(而不是逐个构建它)。
sapply
的解决方案,但与您实现的结果相当(表扬您预先分配对象)。经过分析,似乎大部分时间都花在了which
上。Rprof("vekt.txt"); results <- foo(AA,BB,CC); Rprof(); summaryRprof("vekt.txt")
- Roman Luštrik