2014-09-23 3 views
5

Ich versuche zur Laufzeit herauszufinden, ob meine Funktion eine andere Funktion überschreibt.Überprüfen, ob meine Funktion eine andere Funktion überschreibt

Betrachten Sie das folgende hypothetische Szenario. Ich implementiere eine Funktion namens freqz, die in MATLAB vorhanden sein kann, wenn die Signal Processing Toolbox installiert ist. Wenn es tatsächlich bereits als Teil der Toolbox existiert, möchte ich es in meinem eigenen Namen nennen und das Ergebnis zurückgeben. Wenn es nicht existiert, möchte ich, dass meine eigene Funktion ihre eigene Verarbeitung durchführt.

Hier ist ein Beispiel Pseudo-Code

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

    return result; 

In diesem Fall, wenn jemand foo nennt, werden sie die Version erhalten, die sie erwarten, und wieder auf meine eigene Implementierung fallen, wenn foo von anderswo nicht verfügbar ist. Ist MATLAB in der Lage, so etwas zu tun?

Was ich versucht habe:

  • Aufruf exist innerhalb foo gibt immer 2 (Funktion vorhanden ist), da eine Funktion betrachtet wird erklärt, wenn wir in ihm zum ersten Mal passiert.
  • Das Ausführen von exist von außerhalb einer Funktion in einer m-Datei ist ungültige MATLAB-Syntax.
  • Ich habe keine Möglichkeit gefunden, alle Funktionen mit einem bestimmten Namen aufzulisten. Wenn das möglich ist, würde mich das auf halbem Weg hinbringen (ich würde zumindest etwas über Existenz wissen, müsste aber trotzdem herausfinden, wie ich auf die überschriebene Funktion zugreifen kann).
+0

Sie können einen Unterordner in Ihrem Arbeitsbereich erstellen "Ihre" Funktionen enthält. Zunächst sollten sie Ihrer Hauptfunktion unbekannt sein, so dass Sie nach der Existenz der ursprünglichen Funktion ('which' usw.) suchen können. - Wenn das Ergebnis leer ist, können Sie' addpath' verwenden, um den Ordner mit Ihrer benutzerdefinierten Funktion hinzuzufügen. Es gibt wahrscheinlich elegantere Möglichkeiten, objektorientierte Programmierung zu verwenden. Aber ich bin nicht vertraut damit. – thewaywewalk

+0

Hat eine der hier angebotenen Lösungen für Sie funktioniert? – Divakar

Antwort

0

Nur zwei Vorschläge, keine echte Antwort.

Vielleicht durch das Skript von Namen zu finden (die foo) http://www.mathworks.nl/help/matlab/ref/which.html aber wahrscheinlich verweist auch auf die foo sind Sie bereits in.

Andernfalls würden Sie den vollständigen Pfad für Vorkommen von foo suchen müssen .

2

Durch den Aufruf which können Sie den vollständigen Pfad jeder Funktion erhalten. Angenommen, Sie stellen Sie keine benutzerdefinierten Funktionen in Ordnern namens toolbox scheint dies ganz gut zu funktionieren:

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

nun zu prüfen, ob eine dieser in alle Ihre installierten Werkzeugkästen sind:

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

Dies wird True zurückgeben, wenn die Funktion 'abs' bereits in einer Ihrer Toolboxen vorhanden ist, und 0, wenn dies nicht der Fall ist. Von da an sollte es meiner Meinung nach möglich sein, die Verwendung eines eigenen maßgeschneiderten zu vermeiden.

Sie können auch nach in der findstr suchen, aber ich finde, dass einige Funktionen von Toolboxes dies nicht vor dem Namen haben.

0

Funktionscode

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; 

Bitte beachten Sie die obige Funktionscode ein FEX-Code verwendet function handle genannt, die von here erhalten werden kann.

Verwendungsbeispiel -

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 
Verwandte Themen