c++ 使用Rcpp循环遍历大型多维数组

f87krz0w  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(141)

我正在尝试创建涉及大型多维数组(例如:dimensions = 20 x 1000 x 60),我在R中编写它们的方式运行非常慢。我下载了Rcpp,并一直在尝试实现这样一个模型,因为C++处理循环非常好。通常,我会在R中编写这样一个函数:

fun <- function(x,y,z){
  f <- array(0, dim = c(18,50,10));
  for (i in 1:18){
    for (j in 1:50){
      for (l in 1:10){
        f[i,j,l] <- (i*j/10) + l;
      }
    }
  }
  return(f[x,y,z])
}

并且如预期的,函数产生:

> fun(10,20,5)
[1] 25

这是我认为Rcpp中的等效代码应该是这样的:

cppFunction('
  double fun(int x, int y, int z){
  int f[18][50][10] = {0};
  for (int i = 1; i > 18; i++){
    for (int j = 1; j > 50; j++){
      for (int l = 1; l > 10; l++){
        f[i][j][l] = (i * j/10) + l;
      }
    }
  }
  return f[x][y][z];
  }          
')

但每次我使用这个函数时都会得到0。

> fun(10,20,5)
[1] 0

我将实现的实际模型使用向后迭代,所以我确实需要数组作为函数的一部分,或者,返回数组本身也可以达到我的目的,但我也没有运气。
任何帮助都将受到真诚的感谢。
谢谢

px9o7tmv

px9o7tmv1#

记住C++是0索引的。你需要从0开始索引,而不是像R中那样从1开始。你还需要确保你的循环只在ijl的值小于数组的维数时才继续(所以把>换成<。你的数组需要是double的数组,不是int

Rcpp::cppFunction('
  double fun(int x, int y, int z){
  double f[18][50][10] = {0};
  for (int i = 0; i < 18; i++){
    for (int j = 0; j < 50; j++){
      for (int l = 0; l < 10; l++){
        f[i][j][l] = (i * j/10) + l;
      }
    }
  }
  return f[x][y][z];
  }          
')

试验结果:

fun(10, 20, 5)
#> [1] 25

相关问题