运行 包含函数定义的八度脚本文件
Run octave script file containing a function definition
我有一个非常新手的八度问题。
运行 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
执行它,出现错误:
warning: function name 'recfibo' does not agree with function filename
'/Users/admin/Google Drive/file.m'
error: 'n' undefined near line 2 column 8 error: called from
octave at line 2 column 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))
任何以函数定义开头的 M 文件都是函数 M 文件,而不是脚本 M 文件。通过在顶部添加无意义的语句,将其变成脚本。
在 MATLAB 中(从最近开始),脚本 M 文件可以在脚本末尾定义函数。在那里,您可以将 disp
行放在文件的顶部,并在末尾放置 function
块,其后没有任何脚本行。但是,Octave 要求在使用函数之前定义函数,因此它必须位于使用该函数的脚本行之前。在 MATLAB 引入该功能之前,Octave 允许在脚本文件中定义函数,因此它们的实现与 MATLAB 的实现不兼容。
正如@CrisLuengo 在这里提供的答案中所述,您创建了一个函数文件而不是脚本文件,并且它们在 Octave 中被处理 differently
。因为它是一个函数文件,所以 Octave 通过调用它用 无参数 和 nargout = 0
定义的函数来执行它。所以你会得到一个错误 n
is undefined.
另一个问题是函数名'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
我有一个非常新手的八度问题。
运行 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
执行它,出现错误:
warning: function name 'recfibo' does not agree with function filename '/Users/admin/Google Drive/file.m' error: 'n' undefined near line 2 column 8 error: called from octave at line 2 column 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))
任何以函数定义开头的 M 文件都是函数 M 文件,而不是脚本 M 文件。通过在顶部添加无意义的语句,将其变成脚本。
在 MATLAB 中(从最近开始),脚本 M 文件可以在脚本末尾定义函数。在那里,您可以将 disp
行放在文件的顶部,并在末尾放置 function
块,其后没有任何脚本行。但是,Octave 要求在使用函数之前定义函数,因此它必须位于使用该函数的脚本行之前。在 MATLAB 引入该功能之前,Octave 允许在脚本文件中定义函数,因此它们的实现与 MATLAB 的实现不兼容。
正如@CrisLuengo 在这里提供的答案中所述,您创建了一个函数文件而不是脚本文件,并且它们在 Octave 中被处理 differently
。因为它是一个函数文件,所以 Octave 通过调用它用 无参数 和 nargout = 0
定义的函数来执行它。所以你会得到一个错误 n
is undefined.
另一个问题是函数名'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