[英]Call a function that is not on the Matlab path WITHOUT ADDING THAT PATH
我一直在搜索整個下午並且找不到解決方案來通過指定路徑而不是將其目錄添加到路徑來在matlab中調用函數。
這個問題非常類似於是否可以調用一個不在MATLAB路徑中的函數? ,但在我的情況下,我不想調用內置函數,而只是調用m文件中定義的普通函數。
我認為句柄可能是一個解決方案(因為顯然它們可以引用不在路徑上的函數),但我再次發現沒有辦法創建一個沒有cd
-ing到目錄的句柄,在那里創建它和cd
-ing。 試圖“探索”函數處理對象是什么以及如何通過引用不在路徑上的特定函數來創建一個,這讓我無處可去。
所以解決方案可能來自兩個角度:
1)您知道如何為特定目錄中的m文件創建句柄。
2)你知道一種不在matlab路徑上調用函數的方法。
編輯:我剛剛發現函數functions(myhandle)
實際上讓你看到句柄所引用的文件路徑。 但是仍然無法修改它......
這是可行的,但需要一些解析,並調用evalin
。
我(很多年前!)在MATLAB中央文件交換中添加了一個名為externalFcn
的函數
http://www.mathworks.com/matlabcentral/fileexchange/4361-externalfcn
管理對路徑外函數的調用。 例如,我有一個名為offpathFcn
的函數, offpathFcn
返回一個帶有成功消息的結構,以及一個輸入的值。 將該功能存儲在我的MATLAB路徑中,我可以使用以下方法調用它:
externalfcn('out = C:\MFILES_OffPath\offpathFcn(''this is a test'')');
返回:
out =
success: 1
input: 'this is a test'
(請注意,我的實現是有限的,並且可以改進;您必須包含一個具有相同符號的輸出才能工作。但它應該向您展示如何實現您想要的。)
(MathWorks應用工程師)
注釋1中提到的在調用函數之前創建函數句柄的解決方案很好地實現了@Rody Oldenhuis的FEX貢獻: http : //www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles
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);
我修改了Thierry Dalon的代碼以避免使用feval,我一直覺得不舒服。 請注意,這仍然沒有繞到相關目錄,但是,它發生在幕后,所以假裝它不會發生:-)還要注意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)
run
命令可以從任何目錄運行腳本文件,但是它不能調用函數(帶有輸入和輸出參數)。
feval
和str2func
不允許函數字符串中的目錄信息。
我建議為str2func
編寫自己的包裝器:
但請注意,不在路徑中的函數的句柄可能會中斷,因為該函數將無法調用存儲在其目錄中的其他文件中的任何幫助程序代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.