【发布时间】: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< stabsize;i++)(即i的初始值为i = 1,测试是否i < stabsize,增量为+1)。但现在我不太确定了。
任何关于我哪里出错的建议将不胜感激!
【问题讨论】: