我一直在搜索整个下午,并且找不到通过指定路径而不是将其目录添加到路径来在matlab中调用函数的解决方案。
这个问题与Is it possible to call a function that is not in the path in MATLAB?非常相似,但就我而言,我不想调用内置函数,而只是调用m文件中定义的普通函数。
我认为句柄可能是一个解决方案(因为显然它们可以引用不在路径上的函数),但我再次发现无法创建没有cd
的句柄 - 在目录中创建它,并在那里创建它cd
- 回来了。试图“探索”函数处理对象是什么以及如何通过引用不在路径上的特定函数来创建一个,这使我无处可去。
所以解决方案可能来自两个角度:
1)您知道如何为特定目录中的m文件创建句柄
2)你知道一种不在matlab路径上调用函数的方法。
编辑:我刚刚发现了函数functions(myhandle)
,它实际上让你看到句柄所引用的文件路径。但是仍然无法修改它......
答案 0 :(得分: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应用工程师)
答案 1 :(得分:5)
注释1中提到的在调用函数之前创建函数句柄的解决方案很好地实现了@Rody Oldenhuis' FEX贡献: http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles
答案 2 :(得分: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);
答案 3 :(得分:2)
我修改了Thierry Dalon的代码以避免使用feval,我一直觉得不舒服。请注意,这仍然没有绕过CD到相关目录,但好吧,它发生在幕后,所以假装它没有发生:-) 还要注意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)
答案 4 :(得分:1)
run
命令可以从任何目录运行脚本文件,但是它不能调用函数(带有输入和输出参数)。
feval
和str2func
都不允许函数字符串中的目录信息。
我建议为str2func
编写自己的包装器:
但请注意,不在路径中的函数的句柄可能会中断,因为该函数将无法调用存储在其目录中其他文件中的任何帮助程序代码。