运行包含函数定义的八度脚本文件

时间:2019-01-02 21:13:38

标签: octave

我有一个非常新手的八度音阶问题。
在八度控制台中运行此代码可以正常工作:

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 Drive / file.m'   错误:在第2行第8列附近未定义'n'错误:从调用       第2行第3列的八度音阶

我应该如何解决这个特殊问题?

2 个答案:

答案 0 :(得分:5)

添加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块,其后没有任何脚本行。但是,八度需要在使用函数之前先定义它们,因此它必须位于使用该函数的脚本行之前。在MATLAB引入该功能之前,Octave允许在脚本文件中定义函数,因此它们的实现与MATLAB的实现不兼容。

答案 1 :(得分:5)

如@CrisLuengo提供的答案所述,您已经创建了一个功能文件而不是脚本文件,并且它们在Octave中被differently处理。因为它是一个功能文件,所以Octave通过调用它使用 no arguments 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