Funzioni con MATLAB
Buonasera a tutti!
Mi è sorto un dubbio. E' possibile realizzare due funzioni in uno stesso file di MATLAB?
Il problema che sorge nel mio caso è che ho una funzione che a sua volta si serve di un'altra funzione precedentemente creata.
Come posso risolvere la questione?
Vi ringrazio anticipatamente per le risposte.
Mi è sorto un dubbio. E' possibile realizzare due funzioni in uno stesso file di MATLAB?
Il problema che sorge nel mio caso è che ho una funzione che a sua volta si serve di un'altra funzione precedentemente creata.
Come posso risolvere la questione?
Vi ringrazio anticipatamente per le risposte.
Risposte
Non credo che si possano salvare due funzioni sullo stesso file, ma se sono salvate nella stessa cartella puoi richiamare la prima funzione all'interno della seconda senza problemi
Quindi dovrei realizzare due file *.m e salvarli nella medesima cartella?
Naaaa....
Allora, l'm-file da il nome alla funzione RICHIAMABILE. Quindi se fai un m-file che si chiama cerca.m e all'interno ci sono le funzioni
e
(per fare un esempio) dall'esterno dell'm-file è visibile solo cerca.
Ti faccio vedere un esempio pratico di questa cosa, l'ho fatto per un progettino all'università
Credo sia chiaro: metodo per risolvere sistemi con matrici triangolari. I due metodi "risolviInferiore" e "risolviSuperiore" risolvono gli omonimo casi, ma tu dall'esterno chiami "sistemaTriang(A,b)". Il file è sistemaTriang.m
Inoltre, puoi creare package e dare visibilità agli m-file dove vuoi.
Esempio:
Allora, mi creo le cartelle per fare i package per matlab: ho creato la struttura "+src/+sistemi". Nota il + davanti al nome della cartella: questo fa si che quando punto matlab alla directory dove "+src" è inclusa, essa viene automaticamente inclusa nell'area di lavoro.
Dopodiché creo il mio file sistemaLU.m (dove voglio nella directory di lavoro). All'interno del file ho la riga "import src.sistemi.*;". Questa fa sì che tutti gli m-file presenti sotto "+src/+sistemi" sia disponibili a questo file. A questo punto da sistemaLU.m posso chiamare tutte le funzioni che si trovano in "+src/+sistemi".
NB: Facendo in questo modo, l'unico sconveniente che ho notato è che anche gli m-file che si trovano dentro la stessa cartella, per chiamarsi a vicenda devono importarsi!!!! Infatti nel mio caso sistemaLU.m si trova effettivamente in "+src/+sistemi"... Però mal di poco, è giusto una riga. e l'uso del carattere speciale "*" (asterisco) permette di importare tutti gli m-file in package con una sola istruzione (come in moltissimi linguaggi). Quindi è davvero mal di poco.
Spero di essere stato chiaro, ciao!
Allora, l'm-file da il nome alla funzione RICHIAMABILE. Quindi se fai un m-file che si chiama cerca.m e all'interno ci sono le funzioni
function cerca
e
function somma
(per fare un esempio) dall'esterno dell'm-file è visibile solo cerca.
Ti faccio vedere un esempio pratico di questa cosa, l'ho fatto per un progettino all'università
%Metodo di risoluzione per sistemi triangolari. %function sistemaTriang(A, b) function b = sistemaTriang(A, b) n = length(A); if (triu(A,1)) == zeros(n) %A triangolare inferiore b = risolviInferiore(A, b, n); else %A triangolare superiore b = risolviSuperiore(A, b, n); end end function b = risolviInferiore(A, b, n) for j=1:n if A(j,j) == 0 error('Matrice singolare'); end b(j) = b(j)/A(j,j); for i=j+1:n b(i) = b(i) - A(i,j)*b(j); end end end function b = risolviSuperiore(A, b, n) for j=n:-1:1 if A(j,j) == 0 error('Matrice singolare'); end b(j) = b(j)/A(j,j); for i=1:j-1; b(i) = b(i) - A(i,j)*b(j); end end end
Credo sia chiaro: metodo per risolvere sistemi con matrici triangolari. I due metodi "risolviInferiore" e "risolviSuperiore" risolvono gli omonimo casi, ma tu dall'esterno chiami "sistemaTriang(A,b)". Il file è sistemaTriang.m
Inoltre, puoi creare package e dare visibilità agli m-file dove vuoi.
Esempio:
%Risoluzione di sitemi lineari tramite fattorizzazione LU %B: matrice n x m, ovvero una collezione di m termini noti %ritorna a sua volta una matrice contenente la collezione di m soluzioni %function B = sistemaLU(A,B) function B = sistemaLU(A,B) import src.sistemi.*; [L,U] = fattLU(A); [n,m] = size(B); for i=1:m B(1:n,i) = sistemaTriang(L,B(1:n,i)); B(1:n,i) = sistemaTriang(U,B(1:n,i)); end end
Allora, mi creo le cartelle per fare i package per matlab: ho creato la struttura "+src/+sistemi". Nota il + davanti al nome della cartella: questo fa si che quando punto matlab alla directory dove "+src" è inclusa, essa viene automaticamente inclusa nell'area di lavoro.
Dopodiché creo il mio file sistemaLU.m (dove voglio nella directory di lavoro). All'interno del file ho la riga "import src.sistemi.*;". Questa fa sì che tutti gli m-file presenti sotto "+src/+sistemi" sia disponibili a questo file. A questo punto da sistemaLU.m posso chiamare tutte le funzioni che si trovano in "+src/+sistemi".
NB: Facendo in questo modo, l'unico sconveniente che ho notato è che anche gli m-file che si trovano dentro la stessa cartella, per chiamarsi a vicenda devono importarsi!!!! Infatti nel mio caso sistemaLU.m si trova effettivamente in "+src/+sistemi"... Però mal di poco, è giusto una riga. e l'uso del carattere speciale "*" (asterisco) permette di importare tutti gli m-file in package con una sola istruzione (come in moltissimi linguaggi). Quindi è davvero mal di poco.
Spero di essere stato chiaro, ciao!
"canemacchina":
Allora, mi creo le cartelle per fare i package per : ho creato la struttura "+src/+sistemi". Nota il + davanti al nome della cartella: questo fa si che quando punto matlab alla directory dove "+src" è inclusa, essa viene automaticamente inclusa nell'area di lavoro.
Dopodiché creo il mio file sistemaLU.m (dove voglio nella directory di lavoro). All'interno del file ho la riga "import src.sistemi.*;". Questa fa sì che tutti gli m-file presenti sotto "+src/+sistemi" sia disponibili a questo file. A questo punto da sistemaLU.m posso chiamare tutte le funzioni che si trovano in "+src/+sistemi".
NB: Facendo in questo modo, l'unico sconveniente che ho notato è che anche gli m-file che si trovano dentro la stessa cartella, per chiamarsi a vicenda devono importarsi!!!! Infatti nel mio caso sistemaLU.m si trova effettivamente in "+src/+sistemi"... Però mal di poco, è giusto una riga. e l'uso del carattere speciale "*" (asterisco) permette di importare tutti gli m-file in package con una sola istruzione (come in moltissimi linguaggi). Quindi è davvero mal di poco.
Spero di essere stato chiaro, ciao!
Innanzitutto ti ringrazio per l'esauriente risposta!
Potresti spiegarmi come hai creato la struttura "+src/+sistemi"?
Se ho capito con il primo esempio da te proposto, se chiamo due funzioni all'interno della stessa funzione, il programma legge solo la prima?
"+src/+sistemi" sono solo cartelle!
Allora, il progetto supponiamo che stia nella cartella "progettoCalcoloNumerico" sul tuo pc. Quando apri matlab quindi tu usi come directory corrente "progettoCalcoloNumerico" giusto? Bene, là dentro ho creato una cartella chiamata "+src" e dentro a "+src" la cartella "+sistemi".
Si, da quanto ho visto io in un m-file l'unica funzione richiamabile è quella con lo stesso nome del file. Le altre funzioni sono richiamabili solo dall'interno dello stesso m-file.
Allora, il progetto supponiamo che stia nella cartella "progettoCalcoloNumerico" sul tuo pc. Quando apri matlab quindi tu usi come directory corrente "progettoCalcoloNumerico" giusto? Bene, là dentro ho creato una cartella chiamata "+src" e dentro a "+src" la cartella "+sistemi".
Si, da quanto ho visto io in un m-file l'unica funzione richiamabile è quella con lo stesso nome del file. Le altre funzioni sono richiamabili solo dall'interno dello stesso m-file.
Quindi nella sotto-cartella "+sistemi" hai inserito gli m file, ciascuno dei quali contiene le singole funzioni che ti interessano nel progetto finale, giusto?
Si. Ti dico com'è la struttura delle mie cartelle (un parte, per farti capire).
Ah, uso mac, quindi i path che ti dico sono relativi a mac:
Il progetto sta nei miei documenti:
Ecc ecc.. Capito?
Per esempio, sistemaTriang.m come ti ho detto prima espone la funzione "sistemaTriang(A,b)" che risolve un generico sistema triangolare. La funzione sistemaTriang capisce se A è una matrice triangolare sup o inf e chiama il corretto metodo di risoluzione. I due metodi "risolviSuperiore" e " risolviInferiore" non sono chiamabili dall'esterno di sistemaTriang.m. è come se fossero funzioni private.
O ancora, dentro quella struttura (sotto "+src") c'è anche una cartella "+apprFun" con algoritmi di approssimazione di funzioni. Uno di questi, le spline, devono risolvere sistemi lineari. Dentro al m-file che calcola la splice ci sarà
che mi carica gli m-file della cartella dei sistemi lineari. Così posso chiamare la funzione che voglio per risolvere il sistema lineare associato alla spline che voglio calcolare.
Tutto chiaro? Ciao!
Ah, uso mac, quindi i path che ti dico sono relativi a mac:
Il progetto sta nei miei documenti:
/Users/Master/Documenti/univ/cn/ | ->+src/ | |-> +radici/ | | | -> newton.m, corde.m, secanti.m,... | ->+sistemi/ | -> sistemaTriang.m, sistemaLU.m, ...
Ecc ecc.. Capito?
Per esempio, sistemaTriang.m come ti ho detto prima espone la funzione "sistemaTriang(A,b)" che risolve un generico sistema triangolare. La funzione sistemaTriang capisce se A è una matrice triangolare sup o inf e chiama il corretto metodo di risoluzione. I due metodi "risolviSuperiore" e " risolviInferiore" non sono chiamabili dall'esterno di sistemaTriang.m. è come se fossero funzioni private.
O ancora, dentro quella struttura (sotto "+src") c'è anche una cartella "+apprFun" con algoritmi di approssimazione di funzioni. Uno di questi, le spline, devono risolvere sistemi lineari. Dentro al m-file che calcola la splice ci sarà
import src.sistemi.*;
che mi carica gli m-file della cartella dei sistemi lineari. Così posso chiamare la funzione che voglio per risolvere il sistema lineare associato alla spline che voglio calcolare.
Tutto chiaro? Ciao!
Ok, molto chiaro!
Quindi, in definitiva, sul mio pc, data la cartella contenente il progetto, creo al suo interno un'altra cartella con gli m file necessari. Dopodiché con l'istruzione da te indicata richiamo le funzioni che mi interessano all'interno del programma.
Spero di aver capito!
Quindi, in definitiva, sul mio pc, data la cartella contenente il progetto, creo al suo interno un'altra cartella con gli m file necessari. Dopodiché con l'istruzione da te indicata richiamo le funzioni che mi interessano all'interno del programma.
Spero di aver capito!
Perfetto.
Una volta fatto l'import di quello che ti serve, puoi richiamare tutte le funzioni che vuoi.
Una precisazione: il "+" davanti al nome della cartella serve solo a matlab per fargli capire che quelle cartelle le deve includere nell'area di lavoro. Se non sbaglio potresti fare tutto anche senza mettere il + davanti al nome, ma una volta aperto matlab e aperta la directory di lavoro, dovresti manualmente cliccare di destro sulle cartelle contenenti gli m-file e dire a matlab di includerle nell'area di lavoro.
Per evitare questo spippolamento matto, tanto vale chiamare le cartelle con un "+" davanti, in modo che matlab faccia tutto da sé.
Una volta fatto l'import di quello che ti serve, puoi richiamare tutte le funzioni che vuoi.
Una precisazione: il "+" davanti al nome della cartella serve solo a matlab per fargli capire che quelle cartelle le deve includere nell'area di lavoro. Se non sbaglio potresti fare tutto anche senza mettere il + davanti al nome, ma una volta aperto matlab e aperta la directory di lavoro, dovresti manualmente cliccare di destro sulle cartelle contenenti gli m-file e dire a matlab di includerle nell'area di lavoro.
Per evitare questo spippolamento matto, tanto vale chiamare le cartelle con un "+" davanti, in modo che matlab faccia tutto da sé.
Ok! Ti ringrazio per la disponibilità.
In questi giorni mi metto all'opera e se dovessi avere problemi, tornerò a disturbarti in questa sede!
In questi giorni mi metto all'opera e se dovessi avere problemi, tornerò a disturbarti in questa sede!
Figurati, rispondo volentieri!