2014-09-23 145 views
5

我想在運行時找出我的函數是否覆蓋另一個函數。檢查我的函數是否覆蓋另一個函數

考慮以下假設情況。如果安裝了信號處理工具箱,我正在執行一個名爲freqz的函數,它可能存在於MATLAB中。如果它確實已經作爲工具箱的一部分存在,我想在我自己的內部調用它並返回其結果。如果它不存在,我希望我自己的功能自己處理。

下面是一個示例僞

function foo(args) 
    if overrides_another_function(foo) 
     func = find_overriden_function(foo); 
     result = func(args); 
    else 
     result = my_own_processing(args); 

    return result; 

在這種情況下,當有人撥打foo,他們會得到他們所期望的版本,並依傍我自己的實現,如果foo是從其他地方不可用。 MATLAB能做這樣的事嗎?

我已經試過:

  • 調用內fooexist總是返回2(函數存在),因爲一個功能被認爲聲明一次我們裏面的第一次。
  • 從外部運行exist函數在m文件中是無效的MATLAB語法。
  • 我還沒有找到一種方法來列出給定名稱的所有功能。如果有可能實現,那會讓我有一半的存在(我至少知道存在,但仍然需要弄清楚如何訪問重寫的函數)。
+0

您可以創建在你的工作空間中的子文件夾包含「您」的功能。起初他們應該對你的主函數不知道,所以你可以檢查原函數的存在('which'等) - 如果結果爲空,你可以使用'addpath'來添加你的自定義函數的文件夾。使用面向對象的編程可能有更優雅的方法。但我並不熟悉這一點。 – thewaywewalk 2014-09-23 19:16:42

+0

這裏提供的解決方案是否適合您? – Divakar 2014-09-29 09:14:39

回答

2

通過調用which可以得到任何函數的完整路徑。假設你沒有把裏面的命名toolbox文件夾的任何自定義功能,這似乎工作得很好:

x = which('abs', '-all'); %// Returns a cell array with all the full path 
          %// functions called abs in order of precedence 

現在,要檢查是否有這些都是在你的任何安裝工具箱:

in_toolbox = any(cellfun(@(c) any(findstr('toolbox',c)), x)); 

如果函數'abs'已經存在於其中一個工具箱中,則返回true,如果不存在,則返回0。從那裏我認爲應該可以避免使用自己定製的。

您也可以在findstr中檢查'built-in',但是我發現工具箱中的某些功能沒有在名稱前面有這個功能。

0

功能代碼

function result = feval1(function_name,args) 

%// Get the function filename by appending the extension - '.m' 
relative_filename = strcat(function_name,'.m'); 

%// Get all possible paths to such a function with .m extension 
pospaths = strcat(strsplit(path,';'),filesep,relative_filename); 

%// All paths that have such function file(s) 
existing_paths = pospaths(cellfun(@(x) exist(x,'file'),pospaths)>0); 

%// Find logical indices for toolbox paths(if this function is a built-in one) 
istoolbox_path = cellfun(@(x) strncmp(x,matlabroot,numel(matlabroot)),existing_paths); 

%// Find the first toolbox and nontoolbox paths that have such a function file 
first_toolbox_path = existing_paths(find(istoolbox_path,1,'first')); 
first_nontoolbox_path = existing_paths(find(~istoolbox_path,1,'first')); 

%// After deciding whether to use a toolbox function with the same function name 
%// (if available) or the one in the current directory, create a function handle 
%// based on the absolute path to the location of the function file 
if ~isempty(first_toolbox_path) 
    func = function_handle(first_toolbox_path); 
    result = feval(func,args); 
else 
    func = function_handle(first_nontoolbox_path); 
    result = feval(func,args); 
end 

return; 

請注意上面的功能代碼使用名爲function handle一個FEX的代碼,可以從here獲得。

使用範例 -

function_name = 'freqz';    %// sample function name 
args = fircls1(54,0.3,0.02,0.008); %// sample input arguments to the sample function 
result = feval1(function_name,args) %// output from function operation on input args