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

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

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

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


当前回答

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

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

编辑

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

其他回答

我用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'.

沿着与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);     

你也可以把一个main文件中的函数和main函数组合在一起,就像这样:

function [varargout] = main( subfun, varargin )
[varargout{1:nargout}] = feval( subfun, varargin{:} ); 

% paste your subfunctions below ....
function str=subfun1
str='hello'

然后调用subfun1就像这样: str =主(“subfun1”)

我试过SCFRench和Ru Hasha的八度音。

最后它成功了,但我做了一些修改

function message = makefuns
    assignin('base','fun1', @fun1);   % Ru Hasha
    assignin('base', 'fun2', @fun2);  % Ru Hasha
    message.fun1=@fun1;               % SCFrench
    message.fun2=@fun2;               % SCFrench
end

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

function z=fun2
    z=1;
end

可以在其他'm'文件中调用:

printf("%d\n", makefuns.fun1(123));
printf("%d\n", makefuns.fun2());

更新:

我添加了一个答案,因为+72和+20都不适合我。 我写的那个很好(上周五我在写这篇文章的时候测试了一下)。

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

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