![]() |
是否可以在MATLAB中为每个文件定义多个功能,并从该文件外部访问它们?
在我攻读EE的本科学位时,MATLAB要求每个函数都必须在其自己的文件中定义,即使它是单行的也是如此。
我现在正在攻读研究生学位,所以我必须在MATLAB中编写一个项目。仍然需要更新版本的MATLAB吗? 如果可以在一个文件中放置多个功能,是否对此有任何限制?例如,可以从文件外部访问文件中的所有功能,还是仅从名称相同的功能访问文件? 注意:我正在使用MATLAB版本R2007b。 [B]回答:[/B] m文件中的第一个函数(即[URL="http://www.mathworks.com/help/matlab/ref/function.html"]main函数[/URL] )在调用该m文件时被调用。 [I]不需要[/I] main函数具有与m文件相同的名称,但为清楚起见,它[I]应具有[/I] 。当函数和文件名不同时,必须使用[I]文件名[/I]来调用主函数。 m文件中的所有后续函数(称为[URL="http://www.mathworks.com/help/matlab/matlab_prog/local-functions.html"]本地函数[/URL] (或旧术语中的“子函数”))只能由该m文件中的main函数和其他本地函数调用。其他m文件中的函数无法调用它们。从R2016b开始,您还可以[URL="https://www.mathworks.com/help/matlab/matlab_prog/local-functions-in-scripts.html"]向脚本中添加本地功能[/URL] ,尽管作用域范围仍然相同(即只能在脚本中调用它们)。 此外,您还可以[I]在[/I]其他函数中声明函数。这些称为[URL="http://www.mathworks.com/help/matlab/matlab_prog/nested-functions.html"]嵌套函数[/URL] ,并且只能从它们嵌套的函数内部调用它们。它们还可以访问嵌套它们的函数中的变量,这使它们非常有用,尽管使用起来有些棘手。 [B]更多值得深思的...[/B] 围绕上面概述的常规函数作用域行为,有一些方法,例如将[URL="http://www.mathworks.com/help/techdoc/ref/function_handle.html"]函数句柄[/URL]作为输出参数传递,如[URL="https://stackoverflow.com/a/3571423/52738"]SCFrench[/URL]和[URL="https://stackoverflow.com/questions/3569933/is-it-possible-to-define-more-than-one-function-per-file-in-matlab/3570017#3570017"]Jonas[/URL]的答案中所述(从[URL="https://stackoverflow.com/a/3571423/52738"]R2013b[/URL]开始, [URL="https://www.mathworks.com/help/matlab/ref/localfunctions.html"]localfunctions[/URL]函数[URL="https://www.mathworks.com/help/matlab/ref/localfunctions.html"]localfunctions[/URL]函数提供了[URL="https://www.mathworks.com/help/matlab/ref/localfunctions.html"]localfunctions[/URL] )。但是,我不建议您养成使用这种技巧的习惯,因为组织功能和文件可能有更好的选择。 例如,假设您在m文件Am具有一个主要函数A ,以及局部函数D , E和F现在,假设您在m文件Bm和Cm中分别具有其他两个相关函数B和C ,您还希望能够调用D , E和F这里有一些选项: [LIST][*]将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 ,但是由于您在不同位置具有相同代码的三个副本,因此使代码的更新和维护成为噩梦。 [*] [B]使用[URL="http://www.mathworks.com/help/matlab/matlab_prog/private-functions.html"]私有功能[/URL] ![/B]如果在同一目录中有A , B和C ,则可以创建一个名为private的子目录,并将D , E和F放在其中,每个子目录都作为单独的m文件。这限制了它们的范围,因此它们只能由紧靠其上的目录中的函数(即A , B和C )调用,并将它们放在同一位置(但仍是不同的m文件): myDirectory/ Am Bm Cm private/ Dm Em Fm[/LIST]所有这一切都超出了您的问题范围,并且可能比您需要的更详细,但是我认为最好涉及组织所有m文件的更普遍的关注。 ;) [url=https://stackoverflow.com/questions/3569933]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 01:07。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.