首页 > 解决方案 > for 循环中的错误 - 尝试在 integerOneIndex 中选择少于一个元素

问题描述

我正在尝试将 C 例程从旧的声音合成程序转换为 R,但是有一些我很难理解的索引问题(在使用循环时我是初学者)。

该例程创建一个指数查找表 - 向量exptab

# Define parameters
sinetabsize <- 8192
prop <- 0.8
BP <- 10
BD <- -5
BA <- -1 

# Create output vector
exptab <- vector("double", sinetabsize)

# Loop
while(abs(BD) > 0.00001){
  BY = (exp(BP) -1) / (exp(BP*prop)-1)
  if (BY > 2){
    BS = -1
  }
  else{
    BS = 1
  }
  if (BA != BS){
    BD = BD * -0.5
    BA = BS
    BP = BP + BD
  }
  if (BP <= 0){
    BP = 0.001
  }
  BQ = 1 / (exp(BP) - 1)
  incr = 1 / sinetabsize
  x = 0
  stabsize = sinetabsize + 1
  for (i in (1:(stabsize-1))){
  x = x + incr
  exptab [[sinetabsize-i]] = 1 - (BQ * (exp(BP * x) - 1))
  }
}

运行代码给出错误:

Error in exptab[[sinetabsize - i]] <- 1 - (BQ * (exp(BP * x) - 1)) : 
  attempt to select less than one element in integerOneIndex

我从其他帖子中了解到,这表明存在索引问题。但是,我发现很难解决确切的问题。

我怀疑错误可能在于我的翻译。最后几行的原始 C 代码是:

for (i=1; i < stabsize;i++){
  x += incr;
  exptab[sinetabsize-i] =  1.0 - (float) (BQ*(exp(BP*x) - 1.0));
}

原以为R代码for (i in (1:(stabsize-1)))等价于C代码for (i=1; i< stabsize;i++)(即i的初始值为i = 1,测试为是否i < stabsize,增量为+1)。但现在我不太确定。

任何关于我哪里出错的建议将不胜感激!

标签: rcfor-loopvector

解决方案


正如您所说,R 中的数组索引从 1 开始。在 C 中,它从零开始。我想那是你的问题。能不能sinetabsize-i归零?


推荐阅读