2013-08-12 14 views
8

Domanda: In Matlab, come posso controllare se una funzione è una funzione o un tipo di funzione particolare?Matlab - Controllare se la funzione handle è una funzione particolare o un tipo di funzione

Esempio: Lasciare f1 essere una maniglia di funzione. Come posso verificare se f1 è la funzione Matlab incorporata mean? Come posso verificare se f1 è una funzione anonima?

La mia soluzione corrente: La mia attuale soluzione a questo problema riguarda una chiamata alla funzione functions. functions accetta un handle di funzione come input e restituisce una struttura contenente informazioni sulla funzione di input handle, ad esempio tipo di funzione, percorso, nome funzione ecc. Funziona, ma non è una soluzione ideale perché, per citare lo official documentation:

"Attenzione MATLAB® fornisce la funzione functions solo per scopi di ricerca e debug. Poiché il suo comportamento potrebbe cambiare nelle versioni successive, non dovresti fare affidamento su di esso per scopi di programmazione."

+0

Questo è un domanda valida in astratto, ma mi chiedo perché è necessario farlo? Qual è la cosa più importante dietro la domanda che stai cercando di fare? –

+0

@SamRoberts All'interno di una funzione che accetta 'f1' come uno dei suoi input, sono in grado di prendere alcune scorciatoie se' f1' è uno di un numero di funzioni riconosciute, come una media campionaria ecc. Tuttavia, ho anche voglio che la funzione funzioni per altri tipi di funzioni 'f1' dove tali scorciatoie sono impossibili. Ha senso ciò? –

+2

Colin, potresti leggere questo articolo, in particolare i due commenti (uno citato, uno nei commenti effettivi) di Loren Shure di MathWorks: http://undocumentedmatlab.com/blog/cellfun-undocumented-performance-boost/ Indicherebbe che alcune funzioni incorporate come 'cellfun' affrontano lo stesso problema di te, e risolvono il problema consentendo entrambi gli handle di funzione e un insieme limitato di argomenti di stringa nello stesso punto, fornendo un percorso di codice alternativo e più veloce per il preset stringhe. Solo un pensiero. –

risposta

11

Che ne dici di usare func2str?

Se questa è una funzione incorporata, dovrebbe solo restituire una stringa contenente il nome della funzione; se è una funzione anonima dovrebbe restituire la funzione anonima (incluso @).

h1 = @(x) x.^2; 
h2 = @mean; 
str1 = func2str(h1); %str1 = "@(x) x.^2" 
str2 = func2str(h2); %str2 = "mean" 

È inoltre possibile utilizzare IsEqual per confrontare due manici di funzione (ETA: questo non funzionerà per confrontare due funzioni anonime a meno che uno è stato creato come una copia degli altri):

isequal(h1,@mean); % returns 0 
isequal(h2,@mean); % returns 1 
+0

+1 Esattamente quello che stavo cercando. Grazie molto. –

+5

È necessario fare attenzione: non funzionerà se il percorso sta cambiando. Ad esempio: creare una funzione definita dall'utente 'mean' sul percorso. Crea un handle con 'f = @ mean'. Elimina la funzione definita dall'utente. Crea un handle per il 'mean' integrato con' g = @ mean'. Ora 'func2str (f)' e 'func2str (g)' restituiscono entrambi 'mean'. Inoltre (questo mi sembra un bug) 'isequal (f, g)' restituisce 'true'. Ma sono cose diverse, e 'f' ora errore in quanto il file non è accessibile. Se hai bisogno di preoccuparti delle modifiche al percorso o della funzione di shadowing in questo modo, non penso che ciò che chiedi sia completamente possibile. –

+1

@SamRoberts Punto interessante. Non è un problema per me personalmente: evito accuratamente sia i cambiamenti del percorso di runtime che i nomi di funzioni duplicati, ma il tuo commento è sicuramente una risorsa preziosa per gli altri interessati a questo argomento. Grazie molto. –

Problemi correlati