在MATLAB中,我可以在同一文件中包含脚本和函数定义吗?


81

假设我有一个函数,f()并且想在my_file.m脚本中使用它。

  1. 是否可以在中定义功能my_file.m
  2. 如果没有,假设我在中定义了它f.m。我怎么称呼它my_file.m

我阅读了在线文档,但尚不清楚什么是最好的方法。


4
请注意,您可以将函数放在Octave的脚本中。
Jeremiah Willcock

2
考虑一下此答案,以了解组织代码的方法stackoverflow.com/a/3569946/18775
Anton Daneyko,2013年


4
真正的问题应该是:我想向Mathworks的谁投诉,以解决此荒谬的错误?
2015年

3
从MATLAB 2016b开始,可以在脚本中定义函数。我不确定为什么他们要等32年才能添加此相当基本的功能。
onewhaleid

Answers:


48

从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脚本中定义的唯一函数类型匿名函数。例如:

data = 1:10;            % A vector of data
f = @(x) x.^2;          % An anonymous function
squaredData = f(data);  % Invoke the anonymous function

请注意,匿名函数更适合简单操作,因为它们必须在单个表达式中定义。对于更复杂的功能,您将必须在它们自己的文件中定义它们,将它们放置在MATLAB路径中的某个位置以使它们可被脚本访问,然后像在任何其他函数中一样从脚本中调用它们。


37

克服此限制的方法是将脚本转换为不带参数的函数(如果需要全局名称空间中的变量,则可以在函数中显式传递它们,也可以使用“ evalin”来获取它们)。

然后,您可以在“脚本”中定义所需的所有其他功能。这是一个hack,但是我发现在需要几个非平凡功能的情况下,它非常强大。

编辑:这是一个简单的例子。所有这些都可以驻留在单个文件中。

function [] = myScriptAsAFunction()
   img = randn(200);
   img = smooth(img);
   figure(1);
   imagesc(img);
   axis image;
   colorbar;
end

function simg = smooth(img)
    simg = img / 5;
end

6
+1,当我看到全部清除时,这确实让我很烦;关闭所有; 在matlab脚本的顶部。如果您有太多的变量和曲线图,那么您将无法跟踪它们,那么您使用的函数就不够。
Bi Rico '02

1
您能否提供此“ hack”的示例实现?我似乎无法弄清楚它是如何工作的。
詹姆斯·泰勒

1
注意这种方法的一个问题是当函数退出时,变量永远不会进入工作空间。如果您想在脚本结尾处播放/查看/使用这些变量,可能会出现问题。
chessofnerd

1
@chessofnerd当我遇到问题时,我要么在函数输出中返回变量,要么使用assignin。
约翰

1
@John,我个人觉得必须单独返回所有变量而不是让它们自己显示在工作空间中有点麻烦。就是说,我从未听说过assignin。这是一个整洁的功能,我可能会使用更多!
Chessofnerd 2015年

19

您可以执行以下操作(假设您的文件名为my_file.m):

function my_file
   %script here
end

function out = f(in)
   %function here
end

如果单击运行按钮,该功能my_file将默认执行。


2
这与约翰的答案有什么不同吗?
sancho.s ReinstateMonicaCellio

7

1)您不能在脚本内嵌套函数。

2)确保fm在您的路径或当前目录中,并且您可以像其他任何函数一样调用它。


如果遵循@Oneiros的建议,则可以在脚本中嵌套函数。您甚至可以f从脚本(my_file在他的示例中)调用函数(在他的示例中)。
marcelocra


3

我已经实施了John的解决方案,并且发现它很有用。但是有一些警告(在Octave中; Matlab的行为可能与此类似):

  1. 如果主函数中的代码在clear all使用辅助函数之前包含在其中,则它将不起作用。在file中test3.m,注释/取消注释clear all使代码起作用/不起作用。

    function [] = test3()
      %clear all
      a = myfunc( 1 );
      a
    endfunction;
    
    %---------------------------------
    % Auxiliary functions
    
    function retval = myfunc( a )
      retval = 2 * a;
    endfunction;
    

    From似乎在运行脚本时,首先执行了函数外部的代码(在这种情况下,没有这样的代码),然后将定义的函数(在test3和时myfunc)添加到工作区中。第二次通过将执行main函数,该函数不会找到myfunc是否clear all处于活动状态。

  2. 正如Chessofnerd所指出的,现成的主函数中的变量不会进入工作区。


2

示例文件中可以具有许多功能。但是,运行文件时,只有第一个可以充当主要功能。其他文件只能在此文件中使用。在某些情况下,您想定义一个大函数。您可以将其分成较小的函数,并在其下面进行定义。

但是,找到答案的最简单方法是尝试一下〜

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.