Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/function/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 调用不在Matlab路径上的函数,但不添加该路径_Function_Matlab_Path_Call - Fatal编程技术网

Function 调用不在Matlab路径上的函数,但不添加该路径

Function 调用不在Matlab路径上的函数,但不添加该路径,function,matlab,path,call,Function,Matlab,Path,Call,我搜索了整整一个下午,没有找到在matlab中通过指定函数路径而不将其目录添加到路径来调用函数的解决方案 这个问题非常类似于,但在我的例子中,我不想调用内置函数,只想调用m文件中定义的普通函数 我认为句柄可能是一种解决方案(因为它们显然可以引用不在路径上的函数),但我再次发现,如果不cd-ing到目录,在那里创建句柄,然后cd-ing返回,就无法创建句柄。试图“探索”什么是函数句柄对象,以及如何使用不在路径上的特定函数的引用来创建一个句柄对象,这让我一事无成 因此,解决方案可能来自两个角度: 1

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

这个问题非常类似于,但在我的例子中,我不想调用内置函数,只想调用m文件中定义的普通函数

我认为句柄可能是一种解决方案(因为它们显然可以引用不在路径上的函数),但我再次发现,如果不
cd
-ing到目录,在那里创建句柄,然后
cd
-ing返回,就无法创建句柄。试图“探索”什么是函数句柄对象,以及如何使用不在路径上的特定函数的引用来创建一个句柄对象,这让我一事无成

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

编辑:我刚刚发现了函数
functions(myhandle)
,它实际上可以让您看到句柄引用的文件路径。但是仍然无法修改它…

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

feval
str2func
都不允许函数字符串中包含目录信息

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

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

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

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

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

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

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

out = 
    success: 1
    input: 'this is a test'
(请注意,我的实现是有限的,并且是可以改进的;要使其工作,您必须包含一个带有等号的输出。但它应该向您展示如何实现您想要的。)


(MathWorks应用程序工程师)

我修改了Thierry Dalon的代码,以避免使用feval,这让我感到不舒服。请注意,这仍然无法绕过cd到有问题的目录,但是,它发生在幕后,所以假设它没有发生:-) 还要注意Ben Voigt在上面指出的内容:在路径之外调用helper函数将失败

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)

如注释中所述,在调用函数之前创建函数句柄的解决方案由@Rody Oldenhuis的FEX贡献很好地实现:

FWIW,
feval
命令是此功能最自然的位置,它特别排除了指定目录。“fname参数必须是一个简单的函数名;它不能包含路径信息。”正如一般的兴趣一样:你还记得为什么不想将目录放在你的路径上吗?@RodyOldenhuis在我工作的公司,我们与多个用户在同一台服务器上使用RDP和一个matlab instal(因此,一个matlabrc、一条路径等)用户通常不小心使用该路径,并不断地对其进行破坏。许多用户错误地命名其函数,有时甚至对核心matlab函数进行阴影处理,然后将其文件夹添加到该路径中。我到处都可以看到带有
removepath(…);function();addpath(…)的代码
等等……如果两个用户同时执行,则会中断。因此,最简单的解决方案是能够直接调用特定函数,而不必担心路径。谢谢您的回复。我知道命令
run
,确实是我需要的,但用于函数而不是脚本。我调用了matlab t技术帮助,没有内置的解决方案。谢谢你的回复。是的,我在搜索解决方案时找到了
externalfcn
,但这确实是
cd
s到目录,然后
cd
s回来。这对我来说太慢了。我现在找到的唯一解决方案是通过
cd
ing和
cd
ing back…一旦你有了句柄,函数调用就很快了。@reverse\u工程师:如果你想出了一个像句柄这样的改进方法,你能把它作为一个答案吗?你会得到我的+1。@strpeter不,我最后使用的解决方案是
cd
到目录,在那里创建一个句柄,然后
cd
-ing back。Th恩,句柄仍然指的是特定文件夹中不在路径上的函数,你可以调用这个句柄。但是我没有找到方法用任何其他方法调用不在路径上的函数…我跟踪了你的链接,它的日期是2004年1月,这毕竟不是很多年前的事了;)10岁生日快乐(有7个月的小补偿…也没有那么多:P)你能提供一些解释吗?谢谢你的回答,但这意味着
cd
-ing到函数目录,这是我想要避免的…我不知道其他任何方式:Matlab需要知道你所指的函数。就我所知,只有两种可能:要么在Matlab路径中,要么在当前目录中。in此答案与其他答案有什么不同?不要重复答案…使用与所有其他实现相同的
cd
Output = funeval(@MyFunction, 'c:\SomeDirOffMatlabsPath\', InputArgToMyFunc)