2014-09-23 10 views
5

İşlevimin başka bir işlevi geçersiz kılıp kılmadığını çalışma zamanında öğrenmeye çalışıyorum.İşlevimin başka bir işlevi geçersiz kılıp kılmadığını kontrol etme

Aşağıdaki varsayımsal senaryoları göz önünde bulundurun. Sinyal İşleme Araç Kutusu yüklü ise MATLAB içinde mevcut olabilir freqz adlı bir fonksiyonel uyguluyor. Eğer gerçekten zaten araç kutusunun bir parçası olarak mevcutsa, onu kendi başıma aramak ve sonucunu geri vermek istiyorum. Eğer mevcut değilse, kendi işlevimin kendi işlemesini yapmasını isterim.

Aşağıda örnek bir yalancı kod Bu durumda

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

    return result; 

, birisi foo aradığında, bekledikleri sürümünü alırsınız ve foo başka bir yerden kullanılamaz eğer geri kendi uygulanmasına ilişkin düşmek var. MATLAB böyle bir şey yapabilir mi?

denedim ne

: foo içinde exist çağrılması

  • hep bir işlev olarak kabul edilir çünkü biz ilk kez içine girince ilan 2 (işlev var) döndürür.
  • exist'un m-dosyasındaki bir işlevin dışında çalıştırılması geçersiz MATLAB sözdizimi.
  • Belirli bir adla tüm işlevleri listelemenin bir yolunu bulamadım. Eğer bu mümkün olursa, bu beni yarı yolda bulur (en azından varoluşu hakkında bilgi sahibi olurdum, fakat yine de geçersiz kılınan işleve nasıl erişileceğini anlamaya ihtiyacım olurdu).
+0

Sen "senin" fonksiyonlarını içeren çalışma alanınızdaki bir alt klasörler oluşturabilirsiniz. Öncelikle ana fonksiyonunuz bilinmemek zorundadır, böylece orijinal fonksiyonun varlığını kontrol edebilirsiniz ('' '' '') - eğer sonuç boşsa, 'addpath' fonksiyonunu kullanarak klasöre kendi özel fonksiyonunuzu ekleyebilirsin. Nesne yönelimli programlama kullanarak daha zarif yollar vardır. Ama ben buna aşina değilim. – thewaywewalk

+0

Burada sağlanan çözümlerden herhangi biri sizin için çalışıyor mu? – Divakar

cevap

2

which numaralı telefonu arayarak, herhangi bir işlevin tam yolunu bulabilirsiniz.

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

Şimdi, bunlardan herhangi Yüklü araç kutularından herhangi birinde olup olmadığını kontrol etmek:

in_toolbox = any(cellfun(@(c) any(findstr('toolbox',c)), x)); 
Eğer toolbox isimli klasörlerin içindeki herhangi özel işlevler koymayın varsayarsak, bu oldukça iyi iş gibi görünüyor

'abs' işlevi, araç kutularınızdan birinde zaten mevcutsa ve 0 değilse, bu geri dönecektir. Oradan, kendi ısmarlamanızı kullanmaktan kaçınmanız gerektiğini düşünüyorum.

findstr numaralı telefondan 'built-in' denetleyebilirsiniz, ancak araç kutusundaki bazı işlevlerin bu adın önüne sahip olmadığını fark ettim.

0

Fonksiyon kodu

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; 

yukarıdaki fonksiyon kodu here elde edilebilir function handle adında bir ar kodunu kullanan unutmayınız.

Örnek kullanım -

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 
İlgili konular