【问题标题】:MatLab - Execute functions base on their nameMatLab - 根据名称执行函数
【发布时间】:2012-09-26 22:59:18
【问题描述】:

我有几个 MatLab 函数,几乎所有函数都有测试函数。现在还没有真正的测试函数命名约定,所以我最终得到了 test_functionNametests_functionNameFunctionName_Test 等函数。

不过,我发现这些函数有两个共同点:

  • 名称中包含“test”(大小写不同)。
  • 它们没有输入或输出参数。

我想编写一个函数,它会在给定文件夹下(或在 PATH 中)找到所有遵守这两个条件的函数并执行它们。这样我就可以在一次调用中执行所有测试功能。

有什么办法可以做到吗?

【问题讨论】:

    标签: file matlab


    【解决方案1】:

    你可以这样做:

    fun=dir('*test*.m'); %% look for matlab scripts which name contains 'test'
    fun={fun.name};      %% extract their names
    fun=fun(cellfun(@(x) (nargin(x)==0),fun)); %% select the ones with no input arguments
    fun = regexprep(fun, '.m', ''); % remove '.m' from the filenames
    cellfun(@eval,fun); %% execute them
    

    【讨论】:

    • +1 好答案!但它也会给你 FooTestBar.m。不确定 OP 想要它
    • 必须有一个正则表达式只在结尾或开头给出test。像“test*|*test”这样的东西。我的正则表达式技能生疏了:)
    • 很好,但是我需要执行这些函数。
    • 理想情况下,它需要在文件夹和子文件夹中递归查找函数。
    • @Johnny5,我添加了执行。关于递归的东西......它需要多几行。但我想你可以自己做。只需使用dir(),查看输出的字段isdir 选择目录,检查是否不是'.'或'..',然后使用cd 进入目录,做你的事情,进行递归,然后使用cd.. 退出目录。我相信你,我相信你一定能做到。
    【解决方案2】:

    首先,获取你文件夹下的所有文件:

        d = dir(myFolder);
    

    删除扩展名不是.m的人:

       indexes = strcmp('.m',{d.ext});
       d(indexes) = [];
    

    然后,收集他们所有的名字:

       fileNames = {d.Name};
    

    检查哪一个以 test 开头或结尾:

       testPrefix = strncmp('test',fileNames)
       testPostfix = %# Left as an exercise to the reader
       sutiableFileNames = fileNames( testPrefix | testPostfix);
    

    现在您可以使用 `nargin' 检查参数的数量:

       numOfInParams  = cellfun(@nargin,sutiableFileNames);
       numOfOutParams = cellfun(@nargout,sutiableFileNames);
    

    然后再次过滤(我想你已经明白了)

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      相关资源
      最近更新 更多