180 likes | 271 Views
Lab 8 – Info B. Marco D. Santambrogio – marco.santambrogio@polimi.it Riccardo Cattaneo – cattaneo@elet.polimi.it Ver. aggiornata al 6 Gennaio 2014. Calendario dei Labs. 21 Gennaio 2014, 10am-12.45pm, @ LM1 MATLAB: funzioni ricorsive , funzioni di ordine superiore , grafici 2D e 3D.
E N D
Lab 8 – Info B Marco D. Santambrogio – marco.santambrogio@polimi.it Riccardo Cattaneo – cattaneo@elet.polimi.it Ver. aggiornata al 6 Gennaio 2014
Calendario dei Labs • 21 Gennaio 2014, 10am-12.45pm, @ LM1 • MATLAB: funzioniricorsive, funzioni di ordinesuperiore, grafici 2D e 3D
Lab 8: Agenda • Warm Up (30’) • Qualche cosa un po’ più divertente (60’) • Altri exe… (90’)
Lab 8: Ora.. • Warm Up (30’) • modulo • Qualche cosa un po’ più divertente (60’) • Altri exe… (90’)
modulo: problema • Dato un numero inserito dall’utente, scrivere a video il suo modulo • Si usi una funzione di ordine superiore modulo scritta da voi • Esempio Inserire il numero: >>> -3 >>> 3
modulof1 in Octave %script modulo1 x=input("Inserisci uno scalare: "); modulof1=@(x)((-1)*x); if x<0 r=modulof1(x) else r=x end
modulof2 in Octave %script modulo2 x=input("Inserisci uno scalare: "); minZero = @(x)(~(x>0)); modulof2 = @(x)((-1)*x); if minZero(x) r = modulof2(x) else r=x end
Lab 8: Ora.. • Warm Up (30’) • Qualche cosa un po’ più divertente (60’) • tmp • presente • Altri exe… (90’)
tmp: problema • Facendo uso della funzione di ordine superiore accumulatore • Codificare la funzione tmp(v) • Prende come argomento un vettore di numeri v=[v1,…, vn] • Calcola e restituisce come risultato il valore • Codice della funzione accumulatore function [x]=accumulatore(f, a, u) x = u; for i=1:length(a) x = f(x, a(i)); end
tmp: soluzione function ris = tmp(v) prod = @(x, y) x*y; sum = @(x, y) x+y; ris = accumulatore (prod, v, 1) * accumulatore (sum, v, 0);
presente: problema • Facendo uso delle funzioni di ordine superiore map e acc presentate a lezione, scrivere una funzione presente(x, v) dove x è un valore e v un vettore. • La funzione deve restituire un valore logico true se x è contenuto in v, e deve eseguire il controllo verificando la seguente condizione:x==v(1) OR x==v(2) OR …. x==v(length(v)) • Procedere in questo modo: • Calcolare tramite map un vettore logico che contiene 1 in corrispondenza dei valori del vettore che sono uguali a x • Calcolare poi tramite accumulatore l’OR degli elementi del vettore Codice della funzione map: function [vout]=map(f, vin) for i=1:length(vin) vout(i)=f(vin(i)); end
presente in Octave function [p]=presente(x,v) %Definiamo una variabile funzione che verifichi l'uguaglianza eqx = @(a)a==x; % Tramite map, costruiamo un vettore logico che contiene 1 nelle posizioni % in cui il vettore in ingresso contiene valori uguali a x vp = map(eqx,v); % Definiamo una variabile funzione che calcoli l'OR tra due valori logici OR = @(h,k)h||k; % Tramite acc, calcoliamo l'OR tra tutti gli elementi del vettore logico % ottenuto con map p = accumulatore(OR,vp,0);
Lab 8: Ora… • Warm Up (30’) • Qualche cosa un po’ più divertente (60’) • Altri exe… (90’) • garaTuffi • combinaImmagini
garaTuffi: problema • Facendo uso della funzione di ordine superiore accumulatore • Codificare la funzione garaTuffi(v) • Prende come argomento un vettore di voti v=[v1,…, vn] • Calcola e restituisce come risultato il valore medio dei voti • Codice della funzione accumulatore function [x]=accumulatore(f, a, u) x = u; for i=1:length(a) x = f(x, a(i)); end
garaTuffi: soluzione function ris = garaTuffi(v) sum = @(x, y) x+y; ris = accumulatore (sum, v, 0)/length(v);
combinaImmagini: problema • Si conviene di rappresentare un’immagine mediante una matrice rettangolare di numeri, corrispondenti al colore dei suoi pixel (punti luminosi che compongono la figura) • Si vuole progettare una funzione Octave di nome combinaImmagini che, ricevendo come parametri due matrici f1 ed f2 rappresentanti due immagini e due valori numerici C ed S, con C<S, rappresentanti due diversi colori, produce come risultato una terza figura f3, ottenuta da f1 ed f2 secondo la seguante regola. • Nelle posizioni (r,c) in cui f1(r,c)<C ed f2(r,c)>C si ha f3(r,c)=f2(r,c)-f1(r,c) • Nelle posizioni (r,c) in cui f1(r,c)>S ed f2(r,c)<S si ha f3(r,c)=f1(r,c)-f2(r,c) nelle posizioni rimanenti si ha f3(r,c)=f1(r,c) • Domande • Codificare la funzione combinaImmagini • Scrivere uno script che acquisisce le due matrici di partenza rispettivamente dai file file1.mat e file2.mat (si supponga che le due variabili contenenti le matrici al momento del salvataggio si chiamino matr1 e matr2), richiama la funzione combinaImmagini e salva sul file file3.mat la matrice risultante.
combinaImmagini: soluzione function [f3]=combinaImmagini(f1, f2, C, S) f3=f1; f3(f1<C & f2>C)=f2(f1<C & f2>C)-f1(f1<C & f2>C); f3(f1>S & f2<S)=f1(f1>S & f2<S)-f2(f1>S & f2<S); %script che esegue combinaImmagini load file1.mat matr1; load file2.mat matr2; C= input('inserisci il valore per C: '); S= input('inserisci il valore per S: '); matr3 = combinaImmagini(matr1, matr2, C, S); save file3.mat matr3;
Fonti per lo studio + Credits • Fonti per lo studio • Introduzioneallaprogrammazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio • Capitolo 2, 4, 5 • Credits: • EmanuelePanigati https://sites.google.com/site/engpanigati/