16

我一直在搜索整个下午,但没有找到通过指定路径而不是将其目录添加到路径中来调用 matlab 函数的解决方案。

这个问题非常类似于Is it possible to call a function that is not in the path in MATLAB? ,但就我而言,我不想调用内置函数,而只是调用 m 文件中定义的普通函数。

我认为句柄可能是一个解决方案(因为显然它们可以引用不在路径上的函数),但我再次发现没有办法创建句柄而不cd-ing 到目录,在那里创建它并cd返回 -ing。试图“探索”什么是函数句柄对象以及如何通过对不在路径上的特定函数的引用来制作一个对象,这让我无处可去。

因此解决方案可能来自两个角度:
1)您知道如何为特定目录中的 m 文件创建句柄。
2)您知道一种调用不在 matlab 路径上的函数的方法。

编辑:我刚刚发现了这个函数functions(myhandle),它实际上可以让你看到句柄所指的文件路径。但是仍然没有办法修改它...

4

5 回答 5

9

这是可行的,但需要一些解析,并调用evalin.

我(很多年前!)在 MATLAB 中央文件交换中添加了一个函数,称为externalFcn

http://www.mathworks.com/matlabcentral/fileexchange/4361-externalfcn

管理对非路径函数的调用。例如,我有一个调用的函数offpathFcn,它只返回一个带有成功消息的结构和输入的值。将该函数存储在我的 MATLAB 路径之外,我可以使用以下命令调用它:

externalfcn('out = C:\MFILES_OffPath\offpathFcn(''this is a test'')');

这将返回:

out = 
    success: 1
    input: 'this is a test'

(请注意,我的实现是有限的,并且可以改进;您必须包含一个带有等号的输出才能使其工作。但它应该向您展示如何实现您想要的。)

(MathWorks 应用工程师)

于 2012-10-25T16:26:43.053 回答
5

@Rody Oldenhuis 的 FEX 贡献很好地实现了注释1中提到的在调用函数之前创建函数句柄的解决方案:http: //www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles

于 2014-03-20T12:23:11.337 回答
3
function [varargout]=funeval(fun,varargin)
% INPUT:
% fun: (char) full path to function file
curdir=cd;
[fundir,funname]=fileparts(fun);
cd(fundir);
[varargout{1:nargout}] =feval(funname,varargin{:})
cd(curdir);
于 2013-06-03T18:29:17.960 回答
2

我已经修改了 Thierry Dalon 的代码以避免使用 feval,我总是对此感到不舒服。请注意,这仍然无法绕过 cd-ing 到有问题的目录,但是,它发生在幕后,所以假装它没有发生 :-) 另请注意 Ben Voigt 上面指出的内容:对辅助函数的调用关闭路径将失败。

function [varargout]=funeval(FunctionHandle, FunctionPath, varargin)
% INPUT:
% FunctionHandle: handle to the function to be called; eg @MyFunction
% FunctionPath: the path to that function
% varargin: the arguments to be passed to Myfunction
curdir=cd;
cd(FunctionPath)
[varargout{1:nargout}] = FunctionHandle(varargin{:});
cd(curdir);
end

并调用它看起来像

Output = funeval(@MyFunction, 'c:\SomeDirOffMatlabsPath\', InputArgToMyFunc)
于 2013-11-07T15:39:47.180 回答
1

run命令可以从任何目录运行脚本文件,但不能调用函数(带有输入和输出参数)。

函数字符串中既不允许fevalstr2func不允许目录信息。

我建议为此编写自己的包装器str2func

  • 保存工作目录
  • 将目录更改为脚本目录
  • 创建函数句柄
  • 恢复原来的工作目录

但是请注意,不在路径中的函数的句柄可能会中断,因为该函数将无法调用存储在其目录中其他文件中的任何帮助代码。

于 2012-10-25T16:20:34.883 回答