在MATLAB中,我可以在同一个文件中有脚本和函数定义吗?
假设我有一个函数f()
,我想在my_file.m
使用它,这是一个脚本。
- 是否有可能在
my_file.m
定义函数? - 如果没有,假设我已经在
fm
定义了它。 我如何在my_file.m
调用它?
我阅读在线文档,但不清楚什么是最好的方式来做到这一点。
从版本R2016b开始,可以在脚本中使用本地函数 ,如下所示:
data = 1:10; %# A vector of data squaredData = f(data); %# Invoke the local function function y = f(x) y = x.^2; end
在发布R2016b之前,可以在MATLAB脚本中定义的唯一函数types是匿名函数 。 例如:
data = 1:10; %# A vector of data f = @(x) x.^2; %# An anonymous function squaredData = f(data); %# Invoke the anonymous function
请注意,匿名函数更适合简单的操作,因为它们必须在单个expression式中定义。 对于更复杂的函数,你必须在他们自己的文件中定义它们, 把它们放在MATLABpath的某个地方 ,让它们可以被你的脚本访问,然后像脚本一样调用它们。
我解决这个限制的方法是把我的脚本变成没有参数的函数(如果我需要全局名称空间的variables,我可以在函数中明确地传递它们,或者使用“evalin”来抓取它们。)
然后,您可以在“脚本”中定义所需的所有附加function。 这是一个黑客,但我发现它是相当强大的,在那些我需要几个不平凡的function的情况下。
编辑:这是一个简单的例子。 所有这些都可以驻留在单个文件中。
function [] = myScriptAsAFunction() img = randn(200); img = smooth(img); figure(1); imagesc(img); axis image; colorbar; end function simg = smooth(img) simg = img / 5; end
你可以做这样的事情(假设你的文件名为my_file.m
):
function my_file %script here end function out = f(in) %function here end
如果你点击运行button,函数my_file
将被默认执行。
1)你不能在一个脚本中嵌套一个函数。
2)确保fm在您的path或当前目录中,您可以像调用其他函数一样调用它。
从R2016b开始 ,您可以在脚本中定义本地函数。
x = 1; y = add1(x); function z = add1(x) z = x + 1; end
我已经实施了约翰的解决scheme ,我发现它很有用。 但是有一些注意事项(在Octave中,Matlab的行为可能相似):
-
如果主函数中的代码在使用辅助函数之前
clear all
包含clear all
,则不起作用。 在test3.m
文件中,注释/注释clear all
使代码工作/不工作。function [] = test3() %clear all a = myfunc( 1 ); a endfunction; %--------------------------------- % Auxiliary functions function retval = myfunc( a ) retval = 2 * a; endfunction;
从运行脚本看来,第一次执行的是函数之外的代码(在这种情况下,没有这样的代码),定义的函数(本例中为
test3
和myfunc
)被添加到工作空间中。 第二遍将执行主函数,如果clear all
活动,则不会findmyfunc
。 -
正如chessofnerd所指出的那样,主函数中的variables不会进入工作空间。
示例文件中可以有许多function。 但只有第一个可以作为主要function,当你运行的文件。 其他人只能在这个文件中使用。 对于某些情况你想定义一个大function。 你可以把它分成更小的函数并在其下定义。
但是,find答案最简单的方法就是尝试〜