在我攻读EE的本科学位时,MATLAB要求每个函数都必须在其自己的文件中定义,即使它是单行的也是如此。
我现在正在攻读研究生学位,所以我必须在MATLAB中编写一个项目。仍然需要更新版本的MATLAB吗?
如果可以在一个文件中放置多个功能,是否对此有任何限制?例如,可以从文件外部访问文件中的所有功能,还是仅从名称相同的功能访问文件?
注意:我正在使用MATLAB版本R2007b。
回答:
m文件中的第一个函数(即
main函数 )在调用该m文件时被调用。
不需要 main函数具有与m文件相同的名称,但为清楚起见,它
应具有 。当函数和文件名不同时,必须使用
文件名来调用主函数。
m文件中的所有后续函数(称为
本地函数 (或旧术语中的“子函数”))只能由该m文件中的main函数和其他本地函数调用。其他m文件中的函数无法调用它们。从R2016b开始,您还可以
向脚本中添加本地功能 ,尽管作用域范围仍然相同(即只能在脚本中调用它们)。
此外,您还可以
在其他函数中声明函数。这些称为
嵌套函数 ,并且只能从它们嵌套的函数内部调用它们。它们还可以访问嵌套它们的函数中的变量,这使它们非常有用,尽管使用起来有些棘手。
更多值得深思的...
围绕上面概述的常规函数作用域行为,有一些方法,例如将
函数句柄作为输出参数传递,如
SCFrench和
Jonas的答案中所述(从
R2013b开始,
localfunctions函数
localfunctions函数提供了
localfunctions )。但是,我不建议您养成使用这种技巧的习惯,因为组织功能和文件可能有更好的选择。
例如,假设您在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 ,但是由于您在不同位置具有相同代码的三个副本,因此使代码的更新和维护成为噩梦。
- 使用私有功能 !如果在同一目录中有A , B和C ,则可以创建一个名为private的子目录,并将D , E和F放在其中,每个子目录都作为单独的m文件。这限制了它们的范围,因此它们只能由紧靠其上的目录中的函数(即A , B和C )调用,并将它们放在同一位置(但仍是不同的m文件):
myDirectory/ Am Bm Cm private/ Dm Em Fm
所有这一切都超出了您的问题范围,并且可能比您需要的更详细,但是我认为最好涉及组织所有m文件的更普遍的关注。 ;)
更多&回答...