【发布时间】:2021-04-19 10:45:34
【问题描述】:
我有一个嵌套循环
X <- matrix(c(0.5,0,0,0.75), nrow = 2)
k = nrow(X)
ans1 <- 0
ans2 <- 0
for (aa in 1:k) {
for (bb in 1:k) {
for (cc in 1:k) {
for (dd in 1:k) {
ans1 = ans1 + (0.45 * X[aa,bb] * X[cc,dd])
for (xx in 1:k) {
for (yy in 1:k){
ans2 = ans2 + (1.7*X[aa,bb]*X[xx,yy]*X[cc,dd] + 0.2*X[aa,xx]*X[bb,yy]*X[cc,dd])
}
}
}
}
}
}
但是必须是方阵的矩阵X 可以是非常高的维度。因此,这将大大减慢循环。例如X = matrix(rnorm(10000),nrow = 100,byrow = T)
我想知道是否有更短的压缩方法。这将是可读的,最重要的是稍微快一点。我试过expand.grid,但这并没有多大帮助。
例如ans1
library(tidyverse)
an1 <- expand.grid(rep(list(seq(length(X))),2)) %>% arrange_all()
an11 <- t(apply(an1, 1, function(x) as.vector(t(X))[x]))
但正如我所提到的,这并不能提高速度。有什么建议么?我也认为 Rcpp 可能会有所帮助,但我不确定,我还没有尝试过(c++ 语法不太好)。
【问题讨论】:
-
尽量分解。例如,X[aa,bb] 可以从 cc 和 dd 循环中删除。
-
ans1不等于0.45*sum(X)^2和ans2不等于1.9*sum(X)^3?这些将很快评估。