r - 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)。但现在我不太确定。
任何关于我哪里出错的建议将不胜感激!
解决方案
正如您所说,R 中的数组索引从 1 开始。在 C 中,它从零开始。我想那是你的问题。能不能sinetabsize-i
归零?
推荐阅读
- r - 如何将此数值变量转换为类别
- python - 我在 MySQL 中存储了一个智能合约实例作为字符串。如何将其转换回solidity实例?
- jquery - JQuery 在 td 类中找到一个按钮
- asp.net-mvc - 从 IIS Express 运行 REST 网站返回 404 Not found
- xamarin.forms - Xamarin.Forms + ReactiveUI 导航,IRoutableViewModel 删除/隐藏包含 UrlPathSegment 内容的标题栏
- scala - 在 for 理解中混合 Future 和 F[]
- node.js - 连接到 MongoDb 在线数据库时出现问题
- reactjs - 如何在 React Native Webview 组件中使用 Reactjs 库
- javascript - 如何创建一个对象,其方法将调用传递给最终将实现它们的承诺?
- javascript - Javascript:向多个值对象添加键