登录论坛

查看完整版本 : 是否可以在MATLAB中为每个文件定义多个功能,并从该文件外部访问它们?


poster
2019-12-10, 20:48
在我攻读EE的本科学位时,MATLAB要求每个函数都必须在其自己的文件中定义,即使它是单行的也是如此。

我现在正在攻读研究生学位,所以我必须在MATLAB中编写一个项目。仍然需要更新版本的MATLAB吗?

如果可以在一个文件中放置多个功能,是否对此有任何限制?例如,可以从文件外部访问文件中的所有功能,还是仅从名称相同的功能访问文件?

注意:我正在使用MATLAB版本R2007b。



回答:

m文件中的第一个函数(即main函数 (http://www.mathworks.com/help/matlab/ref/function.html) )在调用该m文件时被调用。 不需要 main函数具有与m文件相同的名称,但为清楚起见,它应具有 。当函数和文件名不同时,必须使用文件名来调用主函数。

m文件中的所有后续函数(称为本地函数 (http://www.mathworks.com/help/matlab/matlab_prog/local-functions.html) (或旧术语中的“子函数”))只能由该m文件中的main函数和其他本地函数调用。其他m文件中的函数无法调用它们。从R2016b开始,您还可以向脚本中添加本地功能 (https://www.mathworks.com/help/matlab/matlab_prog/local-functions-in-scripts.html) ,尽管作用域范围仍然相同(即只能在脚本中调用它们)。

此外,您还可以在其他函数中声明函数。这些称为嵌套函数 (http://www.mathworks.com/help/matlab/matlab_prog/nested-functions.html) ,并且只能从它们嵌套的函数内部调用它们。它们还可以访问嵌套它们的函数中的变量,这使它们非常有用,尽管使用起来有些棘手。

更多值得深思的...

围绕上面概述的常规函数作用域行为,有一些方法,例如将函数句柄 (http://www.mathworks.com/help/techdoc/ref/function_handle.html)作为输出参数传递,如SCFrench (https://stackoverflow.com/a/3571423/52738)和Jonas (https://stackoverflow.com/questions/3569933/is-it-possible-to-define-more-than-one-function-per-file-in-matlab/3570017#3570017)的答案中所述(从R2013b (https://stackoverflow.com/a/3571423/52738)开始, localfunctions (https://www.mathworks.com/help/matlab/ref/localfunctions.html)函数localfunctions (https://www.mathworks.com/help/matlab/ref/localfunctions.html)函数提供了localfunctions (https://www.mathworks.com/help/matlab/ref/localfunctions.html) )。但是,我不建议您养成使用这种技巧的习惯,因为组织功能和文件可能有更好的选择。

例如,假设您在m文件Am具有一个主要函数A ,以及局部函数D , E和F现在,假设您在m文件Bm和Cm中分别具有其他两个相关函数B和C ,您还希望能够调用D , E和F这里有一些选项:


将D , E和F分别放置在各自独立的m文件中,从而允许其他任何函数调用它们。不利之处在于这些函数的范围很大,不仅限于A , B和C ,但不利之处在于这很简单。

使用D , E和F作为局部函数,以及一个仅向其返回函数句柄的主函数,创建一个defineMyFunctions m文件(类似于Jonas的示例)。这使您可以将D , E和F保留在同一个文件中,但是对于这些函数的作用域不做任何事情,因为任何可以调用defineMyFunctions函数都可以调用它们。然后,您还必须担心将函数句柄作为参数传递,以确保将它们放在需要的位置。

将D , E和F复制为Bm和Cm作为本地函数。这将它们的使用范围限制为A , B和C ,但是由于您在不同位置具有相同代码的三个副本,因此使代码的更新和维护成为噩梦。

使用私有功能 (http://www.mathworks.com/help/matlab/matlab_prog/private-functions.html) !如果在同一目录中有A , B和C ,则可以创建一个名为private的子目录,并将D , E和F放在其中,每个子目录都作为单独的m文件。这限制了它们的范围,因此它们只能由紧靠其上的目录中的函数(即A , B和C )调用,并将它们放在同一位置(但仍是不同的m文件):

myDirectory/ Am Bm Cm private/ Dm Em Fm
所有这一切都超出了您的问题范围,并且可能比您需要的更详细,但是我认为最好涉及组织所有m文件的更普遍的关注。 ;)



更多&回答... (https://stackoverflow.com/questions/3569933)