Ошибка для l oop - попытка выбрать менее одного элемента в integerOneIndex - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь перевести подпрограмму 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

Что, как я понимаю, глядя на другие сообщения, указывает на проблему с индексированием. Но мне трудно решить точную проблему.

Я подозреваю, что ошибка может быть ie в моем переводе. Исходный код 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). Но сейчас я не так уверен.

Любые предложения относительно того, где я ошибаюсь, будут очень признательны!

1 Ответ

1 голос
/ 16 июня 2020

Как вы говорите, индексирование массива в R начинается с 1. В C оно начинается с нуля. Думаю, это твоя проблема. Может ли sinetabsize-i когда-нибудь дойти до нуля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...