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

Octave 运行包含函数定义的八度脚本文件,octave,Octave,我有一个非常新的八度音阶问题。 在octave控制台中运行此代码工作正常: function fibo = recfibo(n) if ( n < 2 ) fibo = n; else fibo = recfibo(n-1) + recfibo(n-2); endif endfunction disp(recfibo(5)) 函数fibo=recfibo(n) if(n

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

function fibo = recfibo(n)
  if ( n < 2 )
    fibo = n;
  else
    fibo = recfibo(n-1) + recfibo(n-2);
  endif
endfunction
disp(recfibo(5))
函数fibo=recfibo(n)
if(n<2)
fibo=n;
其他的
fibo=recfibo(n-1)+recfibo(n-2);
恩迪夫
端功能
高级惩教主任(惩教主任(5))
通过将此代码插入名为example file.m的外部文件中,并通过
octave file.m
执行,会发生错误:

警告:函数名“recfibo”与函数文件名不一致 “/Users/admin/Google Drive/file.m” 错误:“n”在第2行第8列附近未定义错误:从调用 第2行第3列的倍频程


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

添加
1作为文件的第一行:

1;

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

disp(recfibo(5))
1;
函数fibo=recfibo(n)
if(n<2)
fibo=n;
其他的
fibo=recfibo(n-1)+recfibo(n-2);
恩迪夫
端功能
高级惩教主任(惩教主任(5))
任何以函数定义开头的M文件都是函数M文件,而不是脚本M文件。通过在顶部添加无意义的语句,可以将其转换为脚本



在MATLAB中(最近),脚本M文件可以在脚本末尾定义函数。在这里,您将把
disp
行放在文件的顶部,并在末尾有
函数
块,后面没有任何脚本行。但是,Octave要求在使用函数之前定义函数,因此它必须位于使用函数的脚本行之前。在MATLAB引入该功能之前,Octave允许在脚本文件中定义函数,因此它们的实现与MATLAB的实现不兼容。

正如@CrisLuengo提供的答案中所述,这里您创建了一个函数文件而不是脚本文件,并且它们在Octave中处理。因为它是一个函数文件,所以Octave通过调用它定义的函数来执行它,该函数不带任何参数且
nargout=0
。因此,您将得到一个
n
未定义的错误

另一个问题是函数名
'recfibo'
与函数名
'file'
不一致。在这种情况下,Octave会在内部将函数名更改为函数文件名,从而将名称更改为
'file'
。因此,倍频程和函数本身将忘记原始函数名,不幸的是,函数不能递归地调用自己

我喜欢@CrisLuengo的答案,但我认为更惯用、更可取的方法是始终使用函数文件而不是脚本文件,尽管脚本文件解决方案是在以前的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
函数文件
高级惩教主任(惩教主任(5))
端功能
函数fibo=recfibo(n)
if(n<2)
fibo=n;
其他的
fibo=recfibo(n-1)+recfibo(n-2);
恩迪夫
端功能

哼哼,我确定有一个副本,但找不到(除了)。我已经把我的评论变成了答案。我同意最好总是写函数。它保持基本工作区的干净。