use*_*926 3 loops r vectorization which
嗨我在R中有一个函数,我正在尝试优化性能.我需要向量化循环.我的问题是稍微复杂的数据结构以及我需要使用'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]
Run Code Online (Sandbox Code Playgroud)
我想将for循环转换为矢量化版本.我不想循环遍历每个元素st,而是想在一个命令中完成它,它给出了一个结果向量(而不是逐个元素地构建它)
提前致谢.
你可以写这样的函数:
foo <- function(AA, BB, CC) {
pa <- AA*CC
x <- outer(pa, pa)
diag(x) <- 0
res <- colSums(x)*BB
return(res)
}
Run Code Online (Sandbox Code Playgroud)
关键的想法是不打破对称性.您对ordered的使用pairs
对应于矩阵的右上角三角形x
.虽然这似乎只是计算值的一半,但语法和计算开销变得非常大.您可以区分st
对中第一个元素与第二个元素的情况.后来这导致摆脱这种区别相当麻烦.拥有完整的对称矩阵,您不必担心顺序,并且事物可以顺利地进行矢量化.