Запустить файл октавного скрипта, содержащий определение функции - PullRequest
0 голосов
/ 03 января 2019

У меня вопрос к октаве новичка.
Выполнение этого кода в октавной консоли работает нормально:

function fibo = recfibo(n)
  if ( n < 2 )
    fibo = n;
  else
    fibo = recfibo(n-1) + recfibo(n-2);
  endif
endfunction
disp(recfibo(5))

При вставке этого кода во внешний файл с именем, например, file.m и выполнении его через octave file.m возникает ошибка:

предупреждение: имя функции 'recfibo' не соответствует имени файла функции '/ Users / admin / Google Диск / file.m' ошибка: 'n' не определено рядом со строкой 2, столбец 8 ошибка: вызывается из октава в строке 2 столбца 3

Как мне решить эту конкретную проблему?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Как указано в ответе @CrisLuengo, вы создали файл функции вместо файла сценария, и они обрабатываются differently в октаве.Поскольку это функциональный файл, Octave выполняет его, вызывая определяемую им функцию с без аргументов и nargout = 0.Таким образом, вы получите сообщение об ошибке, что n не определено.

Другая проблема заключается в том, что имя функции 'recfibo' не соответствует имени файла функции 'file'.В таких случаях Octave внутренне меняет имя функции на имя файла функции, поэтому имя меняется на 'file'.Поэтому Octave и сама функция забудут исходное имя функции, и, к сожалению, функция не может вызывать себя рекурсивно!

Мне нравится ответ @CrisLuengo, но я думаю, что более идиоматичный и предпочтительный способ - всегда с использованием файлов функций вместо файлов сценариев, хотя решение для файла сценариев - это решение only , которое работает в предыдущих версиях Octave (Octave 3.X).

Вы можете изменить свой код на:

function file
    disp(recfibo(5))
endfunction
function fibo = recfibo(n)
    if ( n < 2 )
        fibo = n;
    else
        fibo = recfibo(n-1) + recfibo(n-2);
    endif
endfunction
0 голосов
/ 03 января 2019

Добавьте 1; в качестве первой строки файла:

1;

function fibo = recfibo(n)
  if ( n < 2 )
    fibo = n;
  else
    fibo = recfibo(n-1) + recfibo(n-2);
  endif
endfunction

disp(recfibo(5))

Любой M-файл, который начинается с определения функции, является M-файлом функции, а не M-файлом сценария. Добавляя бессмысленное утверждение в начало, вы превращаете его в скрипт.


В MATLAB (с недавних пор) M-файл скрипта может определять функции в конце скрипта. Там вы бы поместили строку disp вверху файла и в конце поставили блок function без каких-либо строк сценария после него. Однако Octave требует, чтобы функции были определены до того, как вы их используете, следовательно, он должен предшествовать строке сценария, в которой используется функция. Octave разрешил определение функций в файле сценария до того, как MATLAB представил эту функцию, следовательно, их реализация несовместима с реализацией MATLAB.

...