9

首先,这里是我调用函数的方式:

eval([functionName '(''stringArg'')']); % functionName = 'someStringForTheFunctionName'

现在,我functionName的路径中有两个函数,一个接受stringArg,另一个接受其他函数。我遇到了一些错误,因为现在它找到的第一个错误是不采用stringArg. 考虑到我调用functionName函数的方式,怎么可能调用正确的函数?

编辑:

我试过这个功能which

which -all someStringForTheFunctionName

结果 :

C:\........\x\someStringForTheFunctionName
C:\........\y\someStringForTheFunctionName % Shadowed

阴影函数是我要调用的函数。

4

4 回答 4

7

函数名称在 MATLAB 中必须是唯一的。如果不是,则存在重复名称,则 MATLAB 将使用在您的搜索路径中找到的第一个名称。

话虽如此,您有几个选择。

选项 1. 使用 @ 目录,将每个版本放在单独的目录中。本质上,您正在使用 MATLAB 将函数应用于特定类的能力。因此,您可以设置一对目录:

@char
@double

将您的 myfun.m 副本放在相应的目录中。现在,当 MATLAB 看到 myfun 的双重输入时,它会将调用定向到双重版本。当 MATLAB 获得 char 输入时,它会转到 char 版本。

当心。不要将这些 @ 目录明确地放在您的搜索路径上。请务必将它们放在搜索路径上的目录中。

这种方案的一个问题是,如果您使用 SINGLE 精度输入调用函数,MATLAB 可能会很合适,因此您需要单独版本的 single、uint8、int8、int32 等。您不能只有一个版本用于所有数字类型。

选项 2。只有一个版本的函数,它测试第一个参数以查看它是数字还是字符,然后分支以执行适当的任务。这两段代码将最简单地放在一个文件中。简单的方案将具有子函数或嵌套函数来完成工作。

选项 3. 以不同的方式命名函数。嘿,这不是世界末日。

选项 4:正如 Shaun 所指出的,可以简单地更改当前目录。MATLAB 总是首先在您的当前目录中查找,因此它会根据需要在该目录中查找函数。一个问题是这很耗时。每当您触摸目录时,事情都会变慢,因为现在需要磁盘输入。

更改目录最糟糕的部分在于您如何使用 MATLAB。根据他们希望运行的代码输入,强制用户始终位于特定目录中是(恕我直言)一种糟糕的编程风格。更好的是数据驱动方案。如果您要读入或写出数据,请在该目录中。使用 MATLAB 搜索路径对所有函数进行分类,因为函数往往变化不大。与要求用户根据调用给定函数的方式迁移到特定目录相比,这是一种更简洁的工作方式。

就个人而言,我倾向于建议选项 2 为最佳。它是干净的。它只有一个您需要使用的主要功能。如果要保留功能区,请将它们作为单独的嵌套或子功能放在主功能体内。当然,根据它们的驱动方式,它们将具有不同的名称。

于 2013-07-18T15:36:17.430 回答
2

好的,这是一个混乱的答案,但它应该这样做。我的测试功能是“回声”

funcstr='echo'; % string representation of function

Fs=which('-all',funcstr);
for v=1:length(Fs)
    if (strcmp(Fs{v}(end-1:end),'.m')) % Don''t move built-ins, they will be shadowed anyway
        movefile(Fs{v},[Fs{v} '_BK']);
    end
end
for v=1:length(Fs)
    if (strcmp(Fs{v}(end-1:end),'.m')) 
        movefile([Fs{v} '_BK'],Fs{v});
    end
    try
        eval([funcstr '(''stringArg'')']);
        break;
    catch
        if (strcmp(Fs{v}(end-1:end),'.m'))
            movefile(Fs{v},[Fs{v} '_BK']);
        end
    end
end
for w=1:v
    if (strcmp(Fs{v}(end-1:end),'.m'))
       movefile([Fs{v} '_BK'],Fs{v});
    end
end
于 2013-07-18T16:19:57.737 回答
2

您还可以为阴影函数创建函数句柄。问题是 matlab 路径上的第一个函数更高,但您可以通过(临时)更改当前目录来规避它。

虽然更改当前目录并不好 imo(实际上我宁愿在执行代码时永远不要更改它),但它会很容易地解决问题;特别是如果您在函数的配置部分中使用它并带有持久函数句柄:

function outputpars = myMainExecFunction(inputpars)
    % configuration
    persistent shadowfun;
    if isempty(shadowfun)
        funpath1 = 'C:\........\x\fun';
        funpath2 = 'C:\........\y\fun'; % Shadowed

        curcd = cd;
        cd(funpath2);
        shadowfun = @fun;
        cd(curcd); % and go back to the original cd
    end

    outputpars{1} = shadowfun(inputpars); % will use the shadowed function
    oupputpars{2} = fun(inputparts); % will use the function highest on the matlab path
end

此处还讨论了此问题作为该问题的可能解决方案。

我相信它实际上是在重载函数的源目录之外重载内置函数的唯一方法(例如,你想在你所在sum.m的目录之外的目录中运行你自己的函数sum.m。)

于 2013-07-18T19:35:55.337 回答
0

编辑:旧答案不再好

run 命令不起作用,因为它是一个函数,而不是脚本。

相反,您最好的方法是诚实地找出需要运行哪些函数,获取当前目录,将其更改为您的函数所在的目录,运行它,然后再更改回您的启动目录。

这种方法虽然并不完美,但似乎更容易编码、阅读,并且不太容易出错。它不需要更改名称或创建额外的文件或函数句柄。

于 2013-07-18T15:43:19.677 回答