【问题标题】:Error in for loop - attempt to select less than one element in integerOneIndexfor 循环中的错误 - 尝试在 integerOneIndex 中选择少于一个元素
【发布时间】:2020-06-16 15:25:03
【问题描述】:

我正在尝试将 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&lt; stabsize;i++)(即i的初始值为i = 1,测试是否i &lt; stabsize,增量为+1)。但现在我不太确定了。

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

【问题讨论】:

    标签: r c for-loop vector


    【解决方案1】:

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

    【讨论】:

    • 啊,明白了。没有。 exptab 数组中的元素个数与sinetabsize 相同,所以当i = 8192 时,sinetabsize - i = 0。弥补这一点的最佳地点在哪里?
    • :) 是的! [去过那里,穿了很多次那件T恤……] 看起来你正在从头到尾填满exptab。那么只需exptab [[sinetabsize]] = 1 - (BQ * (exp(BP * x) - 1)) 就能解决问题吗?但是您比我更了解您的代码,并且其他变量之间的关系似乎并不明显。尝试一下。如果它有效,请检查它。然后再次检查。重复直到舒适。你能用较小的初始值 `sinetabsize' 运行代码吗?不超过 10 个,比如说?
    • 呵呵-谢谢。很高兴我并不孤单...... :) sinetabsize 是匹配正弦查找表的长度(即匹配指数查找表 exptab),因此它必须保持在该值。我已经尝试了一些似乎可以正确填充向量的方法(例如,将 for 测试更改为 i in sinetabsize:1,同时使用 exptab[[i]],而不是 exptab[[sinetabsize-1]]),但这些似乎导致了我所拥有的永无止境的循环中断 R 停止。你知道为什么会这样吗?
    猜你喜欢
    • 2020-07-28
    • 2016-06-10
    • 1970-01-01
    • 2023-04-04
    • 2015-07-13
    • 2016-01-24
    • 2017-10-03
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多