Function 是否可以调用不在MATLAB路径中的函数?

Function 是否可以调用不在MATLAB路径中的函数?,function,matlab,Function,Matlab,我安装了一个库,它有一些与MATLAB同名的函数。通过安装lib,我指的是addpath。当我尝试调用这些函数时,它将使用lib的实现,但我想调用MATLAB实现 更简单的是:如果我拥有两个函数的绝对地址,如何指定要调用哪个函数 我搜索了答案,但在网站上没有找到。如果您重载任何MATLAB内置函数来处理特定类,那么MATLAB总是调用该类型的重载函数。如果出于某种原因,需要调用内置版本,可以使用内置函数覆盖通常的调用机制。表情 builtin('reshape', arg1, arg2, ...

我安装了一个库,它有一些与MATLAB同名的函数。通过安装lib,我指的是addpath。当我尝试调用这些函数时,它将使用lib的实现,但我想调用MATLAB实现

更简单的是:如果我拥有两个函数的绝对地址,如何指定要调用哪个函数


我搜索了答案,但在网站上没有找到。

如果您重载任何MATLAB内置函数来处理特定类,那么MATLAB总是调用该类型的重载函数。如果出于某种原因,需要调用内置版本,可以使用内置函数覆盖通常的调用机制。表情

builtin('reshape', arg1, arg2, ..., argN);
强制调用MATLAB内置函数重塑,传递显示的参数,即使此参数列表中的类存在重载


使用
运行
,它将允许您使用自己的函数而不是内置函数,而无需将它们添加到路径中

摘自《帮助》:

运行不在当前路径上的脚本 语法

运行脚本名

正如@Cheery所说的,它不能用于接受参数的函数。然而,
run.m
是可修改的文件,所以我制作了一个扩展版本,可以接受参数。它也可以很容易地修改为输出参数

function runExtended(script,varargin)

    cur = cd;

    if isempty(script), return, end
    if ispc, script(script=='/')='\'; end
    [p,s,ext] = fileparts(script);
    if ~isempty(p),
        if exist(p,'dir'),
            cd(p)
            w = which(s);
            if ~isempty(w),
                % Check to make sure everything matches
                [wp,ws,wext] = fileparts(w);
                % Allow users to choose the .m file and run a .p
                if strcmp(wext,'.p') && strcmp(ext,'.m'),
                    wext = '.m';
                end

                if ispc
                    cont = ~strcmpi(wp,pwd) | ~strcmpi(ws,s) | ...
                        (~isempty(ext) & ~strcmpi(wext,ext));
                else
                    cont = ~isequal(wp,pwd) | ~isequal(ws,s) | ...
                        (~isempty(ext) & ~isequal(wext,ext));
                end
                if cont
                    if exist([s ext],'file')
                        cd(cur)
                        rehash;
                        error('MATLAB:run:CannotExecute','Can''t run %s.',[s ext]);
                    else
                        cd(cur)
                        rehash;
                        error('MATLAB:run:FileNotFound','Can''t find %s.',[s ext]);
                    end
                end
                try
                    feval(s,varargin{:});
                    %           evalin('caller', [s ';']);
                catch e
                    cd(cur);
                    rethrow(e);
                end
            else
                cd(cur)
                rehash;
                error('MATLAB:run:FileNotFound','%s not found.',script)
            end
            cd(cur)
            rehash;
        else
            error('MATLAB:run:FileNotFound','%s not found.',script)
        end
    else
        if exist(script,'file')
            evalin('caller',[script ';']);
        else
            error('MATLAB:run:FileNotFound','%s not found.',script)
        end
    end

end

当我将调用一行中的许多内置函数时,我喜欢的另一个解决方案是将我的库临时移动到路径的末尾

libpath = '/home/user/mylib';
% move mylib to the end of the path
addpath(libpath, '-end');
% now call some built-in functions that mylib overwrites
reshape(rand(100),10,10);
% return mylib to the top
addpath(libpath)

当然,如果您使用内置函数的频率高于您的库,则可以将库保留在路径的末尾,并在使用时将其移动到顶部。但是,请注意您当前的目录,它将始终占据路径顺序。

Andrey的回答对我来说并不理想,但它和Loren的建议是“cd到目录,创建” 您的函数句柄,然后是cd back“让我想到了以下几点:

定义一个符合Loren描述的函数:

function functionHandle = getFunctionHandleFromFile( fullFileName )

[pathstr, name, ext] = fileparts(fullFileName);

prevDir = pwd;

cd(pathstr);
functionHandle = str2func(name);
cd(prevDir);
然后你就可以用它来抓把手了。使用句柄,可以调用函数:

nameOf = getFunctionHandleFromFile('/Users/sage/matlab-utilities/nameOf.m')
nameOf(output)

给新的MATLAB用户注意:我建议使用这种方法时要小心!在某些情况下,这可能非常有用,但总的来说,我会问自己,是否有更好的方法来处理您试图解决的问题。这可能会带来比解决问题更多的麻烦。

这个库有多大,你打算用它做多少工作?您希望多久从代码中调用一次它的函数?库中是否有OO代码?它用于脚本,而不是函数!你试过了吗?您将无法以这种方式提供函数参数。这个函数文件调用的结果类似于这样的
???输入参数“x”未定义。
其中“x”是函数的参数。当然。试试这个-函数文件
函数y=myfunc(x)(新行在这里)y=x;disp(y)
将其另存为
myfunc.m
某个地方,然后在Matlab的命令行中尝试
运行path/myfunc.m
。结果将是
???输入参数“x”未定义。
Matlab有两种类型的文件——函数文件和脚本文件。不能直接从编辑器或命令行运行函数文件。函数文件应位于路径中,Matlab将在调用时尝试自行定位。问题是,当函数希望从/向当前工作目录读取/写入文件时,您的方法会中断。另请参阅相关问题和FEX贡献: