当我在攻读EE本科学位时,MATLAB要求每个函数都在自己的文件中定义,即使它是一行程序。

我现在正在攻读研究生学位,我必须用MATLAB写一个项目。这仍然是新版本MATLAB的要求吗?

如果可以在一个文件中放入多个函数,有什么限制吗?例如,可以从文件外部访问文件中的所有函数,还是只能访问与文件名称相同的函数?

注:我使用的是MATLAB版本R2007b。


当前回答

我用Octave在一个.m文件中定义了多个函数,然后在.m文件中使用命令,我需要使用该文件中的函数:

source("mycode.m");

不确定Matlab中是否有。

octave:8> help source
'source' is a built-in function

 -- Built-in Function:  source (FILE)
     Parse and execute the contents of FILE.  This is equivalent to
     executing commands from a script file, but without requiring the
     file to be named `FILE.m'.

其他回答

从R2017b开始,这是不可能的。有关文件指出:

程序文件可以包含多个函数。如果文件只包含函数定义,则第一个函数是主函数,也是MATLAB与文件名关联的函数。在主函数或脚本代码之后的函数称为局部函数。本地函数仅在文件中可用。

但是,其他答案中建议的变通方法也可以达到类似的效果。

在一个文件中拥有多个单独可访问的函数的唯一方法是使用面向对象编程定义STATIC METHODS。你可以通过myClass.static1(), myClass.static2()等方式访问这个函数。

OOP功能从R2008a开始才得到官方支持,所以除非您想使用旧的、未记录的OOP语法,否则答案是否定的,正如@ g新手所解释的那样。

编辑

在文件中定义可从外部访问的多个函数的另一种方法是创建一个返回多个函数句柄的函数。换句话说,您可以将定义函数调用为[fun1,fun2,fun3]=defineMyFunctions,之后您可以使用out1=fun1(输入)等。

沿着与SCFrench的答案相同的路线,但带有更多c#风格的旋转..

我将(并且经常)创建一个包含多个静态方法的类。例如:

classdef Statistics

    methods(Static)
        function val = MyMean(data)
            val = mean(data);
        end

        function val = MyStd(data)
            val = std(data);
        end
    end

end

因为方法是静态的,所以不需要实例化类。你可以这样调用函数:

data = 1:10;

mean = Statistics.MyMean(data);
std = Statistics.MyStd(data);     

我真的很喜欢SCFrench的答案——我想指出,它可以很容易地修改,使用assignin函数直接将函数导入到工作区。(这样做让我想起了Python“import x from y”的做事方式)

function message = makefuns
  assignin('base','fun1',@fun1);
  assignin('base','fun2',@fun2);
  message='Done importing functions to workspace';
end

function y=fun1(x)
  y=x;
end

function z=fun2
  z=1;
end

然后这样使用:

>> makefuns
ans =
Done importing functions to workspace

>> fun1(123)
ans =
   123

>> fun2()
ans =
     1

通常,你的问题的答案是否定的,你不能在一个文件中定义一个以上的外部可见函数。不过,可以将函数句柄返回给局部函数,一种方便的方法是将它们设置为结构体的字段。这里有一个例子:

function funs = makefuns
  funs.fun1=@fun1;
  funs.fun2=@fun2;
end

function y=fun1(x)
  y=x;
end

function z=fun2
  z=1;
end

下面是如何使用它:

>> myfuns = makefuns;
>> myfuns.fun1(5)    
ans =
     5
>> myfuns.fun2()     
ans =
     1