10 Tipi di dati strutturat
10.4 Uso del ciclo for con le matric
Analogamente a quanto visto per i vettori, è possibile usare i cicli for anche per trattare con le matrici. Facciamo vedere ora alcuni esempi di tale utilizzo.
Una funzione che calcola la somma dei quadrati degli elementi di una matrice è function s=somma_quadrati_matrice(a)
nr=rows(a); nc=columns(a); s=0;
for k=1:nc
s=s+a(h,k)^2; endfor
endfor endfunction
Una funzione che calcola la somma di due matrici, nell'ipotesi in cui abbiano lo stesso numero di righe e di colonne è function c=somma_matrici(a,b) nr=rows(a); nc=columns(a); for h=1:nr for k=1:nc c(h,k)=a(h,k)+b(h,k); endfor endfor endfunction
Infine una funzione che implementa il prodotto righe per colonne tra due matrici, nell'ipotesi che tale prodotto abbia senso (il numero delle colonne della prima matrice deve essere uguale al numero di righe della seconda) è
function c=prodotto_matrici(a,b) nr=rows(a);
nc=columns(b); nn=columns(a);
% nn deve essere uguale anche a rows(b) for h=1:nr for k=1:nc s=0; for r=1:nn s=s+a(h,r)+b(r,k); endfor c(h,k)=s; endfor endfor endfunction
Infatti tale funzione è basata sulla formula chk=
∑
r =1 nn ahrbrk per h=1,...,nr e k=1,...,nc.Anche in questo caso però si invita a sfruttare al massimo le potenzialità di Matlab nel trattamento di vettori e matrici, evitando, quando ciò è possibile, di usare i cicli for.
10.5 Esercizi (da svolgere con cicli for e while)
1. Scrivere una funzione che dato un vettore x e un numero intero m, minore o uguale alla dimensione di x, calcola la somma degli elementi dal m-esimo elemento in poi.
2. Scrivere una funzione che dato un vettore x, trova il più grande elemento tra quelli di posizione dispari.
3. Scrivere una funzione che calcola la norma in Lp di un vettore x, ovvero
p∑
i=1n
∣xi∣p n
4. Scrivere una funzione che concatena due vettori riga x e y.
5. Scrivere una funzione che dato due vettori x e y di ugual lunghezza, crea un vettore che prende gli elementi da x e da y in modo alternato, ad esempio da [1,2,3] e [4,5,6] crea [1,4,2,5,3,6].
6. Scrivere una funzione che dato un vettore x, restituisce come risultato un vettore identico ad x, senza però l'ultimo elemento.
7. Scrivere una funzione che dato un vettore x, restituisce il vettore con gli elementi posizionati nell'ordine opposto: ad esempio da [1,2,3,4] restituire [4,3,2,1].
8. Scrivere una funzione che dato un vettore x, restituisce come risultato un vettore contenente solo gli elementi di x che sono pari.
9. Scrivere una funzione, che dati due vettori x e y, rappresentanti due insiemi, calcola l'intersezione, ovvero gli elementi in comune. Suggerimento: sfruttare la funzione appartiene e traendo spunto dalla soluzione dell'esercizio precedente, dato che A∩B={x∈ A: x∈B}
10. Nelle ipotesi dell'esercizio 9, calcolare l'unione di A e B.
11. Nelle ipotesi dell'esercizio 9, calcolare la differenza simmetrica.
12. Scrivere una funzione che dato un vettore contenente i coefficienti di un polinomio p (ad esempio [1,2,3] rappresenta il polinomio p(x)=1+2x+3x2) e un numero reale t, calcola p(t).
13. Nelle ipotesi dell'esercizio precedente, calcolare p'(t).
14. Scrivere una funzione che controlla se un dato vettore è palindromo, ovvero è uguale a se stesso anche rovesciando l'ordine dei suoi elementi. Ad esempio [1,2,3,2,1] e [1,2,3,3,2,1] sono palindromi.
15. Scrivere una funzione che calcola il determinante di una matrice 3x3. 16. Scrivere una funzione che dato n crea la matrice identità di dimensione n
17. Scrivere una funzione che data una matrice quadrata calcola la traccia, ovvero la somma degli elementi sulla diagonale principale.
18. Scrivere una funzione che data una matrice A, trova l'elemento più grande di A in valore assoluto
19. Scrivere una funzione che data una matrice A, controlla se A è triangolare superiore, ovvero che ogni elemento al di sotto della diagonale principale è nullo.
20. Scrivere una funzione che data una matrice A restituisce come risultato il vettore contenente la somma degli elementi di ciascuna colonna.
21. Scrivere una funzione che data una matrice A, restituisce il numero della riga con il maggior numero di zeri (o -1, se ogni riga non ha zeri).
11
Funzioni
In questo capitolo vedremo in dettaglio la sintassi, la semantica (intuitiva) e le principali caratteristiche delle funzioni definite dall'utente, fornendo alla fine una serie di motivazioni per il loro impiego.
Il termine funzione definita dall'utente viene utilizzato in questo capitolo in opposizione al concetto di funzione predefinita, come ad esempio cos, sin o log, cioè funzioni già presenti nel linguaggio Matlab.
11.1 Sintassi
La gestione di una funzione distingue due momenti differenti: la definizione e la chiamata. Nella definizione si crea una nuova funzione indicando (in qualche modo) dominio, codominio e comportamento. Nella chiamata la funzione viene valutata su determinati argomenti. E' evidente che una funzione viene definita una sola volta, ma può essere chiamata tante volte, anche all'interno di altre funzioni.
Una funzione viene definita con la seguente sintassi
function risultato=nomeFunzione(parametri)
istruzioni
endfunction
in cui
• nomeFunzione è il nome della funzione;
• parametri è un elenco di variabili, separate da virgole;
• risultato è una singola variabile o un elenco di variabili tra parentesi quadre e separate da
virgola; è anche possibile definire funzioni senza risultato esplicito, omettendo completamente questa parte;
• endfunction si può abbreviare in end.
La chiamata di una funzione ha la sintassi
nomeFunzione(argomenti)
o, nel caso in cui questa fornisca più risultati, la sintassi
[risultato1,...,risultatoN]=nomeFunzione(argomenti)
in cui argomenti è un elenco di espressioni separate da virgole.
Una chiamata ad una funzione è valida solo quando il numero degli argomenti forniti è pari al numero dei parametri nella definizione della funzione. Infatti al momento della chiamata si stabilisce una corrispondenza biunivoca (temporanea) tra argomenti e parametri. Inoltre il corretto funzionamento presuppone che ogni argomento corrisponda ad un valore sensato per il corrispondente parametro. Ad esempio se una funzione ha un parametro di tipo matrice, allora in ogni chiamata l'argomento associato deve essere una matrice, altrimenti si genera una situazione di errore.
Avendo la seguente definizione di funzione function p=potenza(x,n) p=1; for h=1:n p=p*x; endfor endfunction
una chiamata corretta è z=2;
potenza(3.1*z, 4)
in cui l'argomento 3.1*z, cioè 6.2, corrisponde al parametro x e l'argomento 4 corrisponde al parametro n.
Invece esempi di chiamate scorrette sono potenza(z/2, 4, -17)
potenza(z)
La prima infatti ha troppi argomenti, mentre la seconda ne ha pochi.
Si noti che il parametro x può assumere qualsiasi valore scalare (anche complesso), mentre n deve essere un numero intero non negativo, altrimenti la funzione potenza non opera correttamente, quindi anche
potenza(z, 4.5)
non rappresenta una chiamata corretta.
11.2 Semantica
Supponiamo che una funzione f chiama una funzione g con argomenti a1,...,an, ovvero con la
chiamata g(a1,...,an), mentre siano p1,...,pn i parametri di g, cioè è definita nel seguente modo
function r=g(p1,...,pn)
…
endfunction
Avvengono allora nell'ordine le seguenti azioni:
1. Gli argomenti della chiamata a1,...,an sono valutati e vengono memorizzati nei
corrispondenti parametri di g: il valore di a1 viene memorizzato nel primo parametro p1, il
valore di a2 in p2, e così via.
2. L'esecuzione di f è arrestata e in qualche modo Matlab si ricorda del punto in cui f è stata interrotta
3. Inizia l'esecuzione delle istruzioni di g. 4. L'esecuzione di g finisce.
5. Le variabili create in g, compresi i parametri p1,...,pn e i risultati r, vengono eliminate dalla
6. L'esecuzione di f riprende dal punto in cui si era interrotta, usufruendo del risultato prodotto da g, cioè del valore che era contenuto nella variabile risultato r.
Si noti che la chiamata ad una funzione sospende momentaneamente l'esecuzione di f, ovvero Matlab non prevede l'esecuzione di più funzioni contemporaneamente. Del resto se f ha bisogno subito del risultato di g, non può far altro che aspettare che g sia finita.