In MATLAB, posso avere uno script e una definizione di funzione nello stesso file?

Supponiamo che abbia una funzione f() e voglio usarla in my_file.m , che è uno script.

  1. È ansible avere la funzione definita in my_file.m ?
  2. In caso contrario, supponiamo di averlo definito in fm . Come posso chiamarlo in my_file.m ?

Ho letto la documentazione online, ma non è chiaro quale sia il modo migliore per farlo.

A partire dalla versione R2016b, puoi avere funzioni locali negli script , in questo modo:

 data = 1:10; % A vector of data squaredData = f(data); % Invoke the local function function y = f(x) y = x.^2; end 

Prima di rilasciare R2016b, l’unico tipo di funzione che poteva essere definita all’interno di uno script MATLAB era una funzione anonima . Per esempio:

 data = 1:10; % A vector of data f = @(x) x.^2; % An anonymous function squaredData = f(data); % Invoke the anonymous function 

Si noti che le funzioni anonime sono più adatte a operazioni semplici, poiché devono essere definite in una singola espressione. Per le funzioni più complicate, dovrai definirle nei loro file, metterle da qualche parte sul percorso MATLAB per renderle accessibili al tuo script e quindi chiamarle dal tuo script come faresti con qualsiasi altra funzione.

Il modo in cui aggiro questa limitazione è di trasformare i miei script in funzioni che non accettano argomenti (se ho bisogno di variabili dal namespace globale, o le passo esplicitamente nella funzione, o uso “evalin” per prenderle).

Quindi puoi definire tutte le funzioni aggiuntive necessarie nello “script”. È un hack, ma ho trovato che sia piuttosto potente in quei casi in cui ho bisogno di diverse funzioni non banali.

EDIT: Ecco un esempio semplicistico. Tutto questo può risiedere in un singolo file.

 function [] = myScriptAsAFunction() img = randn(200); img = smooth(img); figure(1); imagesc(img); axis image; colorbar; end function simg = smooth(img) simg = img / 5; end 

Puoi fare qualcosa di simile (supponendo che il tuo file sia denominato my_file.m ):

 function my_file %script here end function out = f(in) %function here end 

Se fai clic sul pulsante my_file , la funzione my_file verrà eseguita come predefinita.

1) Non è ansible nidificare una funzione all’interno di uno script.

2) Assicurati che fm sia sul tuo percorso o nella directory corrente, e puoi chiamarlo come qualsiasi altra funzione.

A partire da R2016b , è ansible definire funzioni locali all’interno di uno script.

 x = 1; y = add1(x); function z = add1(x) z = x + 1; end 

Ho implementato la soluzione di John e l’ho trovato utile. Ma ci sono un paio di avvertimenti (in Octave, Matlab potrebbe comportarsi allo stesso modo):

  1. Se il codice all’interno della funzione principale contiene clear all prima di utilizzare la funzione ausiliaria, non funzionerà. Nel file test3.m , commentando / decommentando clear all fa sì che il codice funzioni / non funzioni.

     function [] = test3() %clear all a = myfunc( 1 ); a endfunction; %--------------------------------- % Auxiliary functions function retval = myfunc( a ) retval = 2 * a; endfunction; 

    Da Sembra che quando si esegue uno script, ci sia un primo passaggio in cui viene eseguito il codice esterno alle funzioni (in questo caso, non esiste tale codice) e le funzioni definite (in questo caso, test3 e myfunc ) vengono aggiunte all’area di lavoro. Un secondo passaggio eseguirà la funzione principale, che non troverà myfunc se è clear all .

  2. Come sottolineato da chessofnerd, le variabili nella tua funzione principale non vanno direttamente nello spazio di lavoro.

Puoi avere molte funzioni in un file di esempio. Ma solo il primo può agire come una funzione principale, quando si esegue il file. Altri possono essere usati semplicemente in questo file. Per alcune situazioni si desidera definire una grande funzione. Puoi separarlo in funzioni più piccole e definirlo sotto di esso.

Tuttavia, il modo più semplice per trovare la risposta è provare ~