2012-10-25 47 views
11

我一直在搜索整個下午,並沒有找到解決方案,通過指定其路徑並且不將其目錄添加到路徑中來調用matlab函數。調用不在Matlab路徑上的函數而不添加該路徑

這個問題與Is it possible to call a function that is not in the path in MATLAB?非常相似,但在我的情況下,我不想調用內置函數,而只是調用m文件中定義的普通函數。

我想把手可能是一個解決方案(因爲顯然他們可以參考的功能不是路徑上),但我再次發現沒有辦法不cd -ing的目錄下創建一個手柄,有創造它和cd - 回來。試圖「探索」一個函數句柄對象是什麼,以及如何讓一個參考具體功能而不是路徑導致我沒有任何地方。

所以解決方案可能來自兩個角度:
1)您知道如何爲特定目錄中的m文件創建句柄。
2)你知道一種調用不在matlab路徑上的函數的方法。

編輯:我剛剛發現了函數functions(myhandle),它實際上可以讓你看到句柄所引用的文件路徑。但仍然沒有辦法修改它雖然...

+0

FWIW,'feval'命令,這是該功能最自然的地方,明確排除指定目錄。 「'fname'參數必須是一個簡單的函數名稱,它不能包含路徑信息。」 –

+1

正如一般的興趣一樣:你是否記得*爲什麼*你不想把目錄放在你的路上? –

+0

@RodyOldenhuis在我工作的公司,我們與同一臺服務器上的多個用戶一起工作,使用RDP安裝一個matlab程序(因此一個matlabrc,一個路徑等)。用戶通常不小心路徑並不斷修改它。許多用戶錯誤地命名它們的功能,有時甚至會影響核心matlab函數,然後將它們的文件夾添加到路徑中。我用'removepath(...); function(); addpath(...)'等等看到代碼......如果兩個用戶同時執行這個操作,就會中斷代碼。所以最簡單的解決方案是能夠直接調用特定功能,而不用擔心路徑 –

回答

1

run命令可以從任何目錄運行腳本文件,但它不能調用一個函數(帶有輸入和輸出參數)。

fevalstr2func都不允許在函數字符串中存在目錄信息。

我建議寫自己的包裝爲str2func是:

  • 保存工作目錄
  • 改變目錄的腳本目錄
  • 創建了一個函數處理
  • 恢復原來的工作目錄

但是,請注意,函數的句柄不在t他的路徑可能會中斷,因爲該函數將無法調用存儲在其目錄中其他文件中的任何幫助程序代碼。

+0

感謝您的回覆。我已經知道命令'run'了,事實上它就是我需要的東西,但是對於函數而不是腳本。我稱之爲matlab技術幫助,並沒有這樣的內置解決方案。 –

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公司的應用工程師)

+2

感謝您的回覆。是的,我在搜索解決方案時發現了'externalfcn',但這確實是'cd'到目錄和'cd's的後面。對我的目的來說這是令人無法接受的緩慢。我現在找到的唯一解決方案是通過'cd'和'cd'回創建一個句柄......一旦你有句柄,函數調用就會很快。 –

+0

@reverse_engineer:如果您想出了一種像手柄一樣的改進方法,您可以將它作爲答案發布嗎?你將擁有我的+1。 – strpeter

+2

@strpeter不,我最終使用的解決方案是「cd」到目錄,在那裏創建一個句柄,然後「cd」回來。然後,句柄仍然引用不在路徑上的特定文件夾中的函數,並且可以調用此句柄。但我發現沒有辦法使用任何其他方法調用不在路徑上的函數...... –

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); 
+0

你能提供一些解釋嗎? – Undo

+0

感謝您的回答,但這意味着'cd'-ing函數目錄,我希望避免...' –

+0

我不知道任何其他方式:Matlab需要知道你的意思。對於它,據我所知只有兩種可能性:無論是在Matlab路徑還​​是當前目錄。 –

2

我修改了Thierry Dalon的代碼,以避免使用feval,我總是覺得不舒服。請注意,這仍然沒有解決問題所在的目錄,但是,它發生在幕後,因此假裝它不會發生:-)另請注意本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) 
+0

這個答案與[Dalon的一個]不同(http://stackoverflow.com/a/16903404/1714410)有什麼不同?不要複製答案... – Shai