Matlab: Funzioni. Informatica B. Daniele Loiacono



Похожие документы
AA LA RICORSIONE

Introduzione al MATLAB c Parte 2

Funzioni in C. Violetta Lonati

Corso di Informatica

Concetto di Funzione e Procedura METODI in Java

Lezione 8. La macchina universale

Fasi di creazione di un programma

Sottoprogrammi: astrazione procedurale

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

FONDAMENTI di INFORMATICA L. Mezzalira

INFORMATICA 1 L. Mezzalira

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

La ricorsione. Politecnico di Milano Sede di Cremona

Studente: SANTORO MC. Matricola : 528

Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2)

Introduzione allo Scilab Parte 3: funzioni; vettori.

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Descrizione di un algoritmo

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Interpolazione ed approssimazione di funzioni

Introduzione. Informatica B. Daniele Loiacono

Linguaggio C - Funzioni

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Scrivere uno script php che, dato un array associativo PERSONE le cui chiavi sono i

I puntatori e l allocazione dinamica di memoria

La selezione binaria

Struttura di un programma Java

Tecniche avanzate di sintesi di algoritmi: Programmazione dinamica Algoritmi greedy

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

MIPS Instruction Set 2

Laboratorio di Informatica

Esercizi Capitolo 6 - Alberi binari di ricerca

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA. INFORMATICA B Ingegneria Elettrica. La ricorsione

Inizializzazione, Assegnamento e Distruzione di Classi

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Introduzione alla tecnica di Programmazione Dinamica

Nozione di algoritmo. Gabriella Trucco

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Allocazione dinamica della memoria - riepilogo

Programmazione I - Laboratorio

GESTIONE INFORMATICA DEI DATI AZIENDALI

Fondamenti di Informatica Ingegneria Clinica Lezione 19/10/2009. Prof. Raffaele Nicolussi

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Corso di Calcolo Numerico

Algoritmi di Ricerca. Esempi di programmi Java

Metodologie di programmazione in Fortran 90

+ / operatori di confronto (espressioni logiche/predicati) / = > < Pseudo codice. Pseudo codice

Laboratorio di programmazione

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Esercizio 1. Esercizi 5. Esercizio 3. Esercizio 2 CICLI

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Codifica: dal diagramma a blocchi al linguaggio C++

Obiettivi dell Analisi Numerica. Avviso. Risoluzione numerica di un modello. Analisi Numerica e Calcolo Scientifico

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Laboratorio 2. Calcolo simbolico, successioni, limiti e derivate

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Metodi Stocastici per la Finanza

Tale attività non è descritta in questa dispensa

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B

Protezione. Protezione. Protezione. Obiettivi della protezione

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Sistema operativo: Gestione della memoria

STRUTTURE DEI SISTEMI DI CALCOLO

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

Analizzatore lessicale o scanner

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci

7.4 Estrazione di materiale dal web

Aritmetica dei Calcolatori 2

Facoltà di Ingegneria Industriale. Matlab/Octave - Esercitazione 3

Corso di PHP. Prerequisiti. 6.1 PHP e il web 1. Conoscenza HTML Tecnica della programmazione Principi di programmazione web

Algoritmi di ordinamento

Struttura logica di un programma

Calcolatori: Algebra Booleana e Reti Logiche

Lezione 4 Le code. Informatica. 26 Aprile Le pizze devono essere preparate e consegnate seguendo l ordine di arrivo degli ordini

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO...

Istruzioni condizionali. Istruzioni condizionali IF-THEN- ELSE IF-THEN-ELSE. Statistica computazionale Carla Rampichini a.a.

Università degli Studi di Ferrara - A.A. 2014/15 Dott. Valerio Muzzioli ORDINAMENTO DEI DATI

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Транскрипт:

Matlab: Funzioni Informatica B

Funzioni

A cosa servono le funzioni? 3 x = input('inserisci x: '); fx=1 for i=1:x fx = fx*x if (fx>220) y = input('inserisci y: '); fy=1 for i=1:y fy = fy*y

A cosa servono le funzioni? 4 x = input('inserisci x: '); fx=1 for i=1:x fx = fx*x if (fx>220) y = input('inserisci y: '); fy=1 for i=1:y fy = fy*y

A cosa servono le funzioni? 5 Riusabilità Scrivo una sola volta codice utilizzato spesso Modifiche e correzioni sono gestibili facilmente Leggibilità Incapsulo porzioni di codice complesso Aumento il livello di astrazione dei miei programmi Flessibilià Posso aggiungere funzionalità non presenti nelle funzioni di libreria

Usiamo uno script file? 6 Uno script file può essere usato per incapsulare prozioni di codice riusabili in futuro x = input('inserisci x: '); f=1 fx=1 for i=1:n for i=1:x f = f*i fx = fx*i if (f>220) fattoriale.m y = input('inserisci y: '); fy=1 for i=1:y fy = fy*i

Limiti degli script-files 7 Problemi: Come fornisco l input allo script? Dove recupero l output? Gli script utilizzano le variabili dello workspace: x = input('inserisci x: '); n=x Prepara l input in n fattoriale chiama lo script fx=f Salva il risultato in f if (f>220) y = input('inserisci y: '); n=y Prepara l input fattoriale chiama lo script fy=f Salva il risultato in f f=1 for i=1:n f = f*i fattoriale.m

Limiti degli script-files (2) 8 Workspace n=x fattoriale fx x n f f=1 for i=1:n fx=f f = f*i Questo meccanismo ha molti svantaggi: poco leggibile richiede molte istruzioni poco sicuro

Le funzioni testata 9 function f=fattoriale(n) f=1 for i=1:n f = f*i corpo n è l argomento della funzione (serve a fornire l input) f è il valore di ritorno della funzione (serve a fornire l output) La testata inizia con la parola chiave function e definisce: nome della funzione argomenti (input) valore di ritorno (output) Il corpo definisce le istruzioni da eseguire quando la funzione viene chiamata Utilizza gli argomenti e assegna il valore di ritorno

Le funzioni (2) 10 Una funzione può avere più argomenti separati da virgola: function f(x,y) Nel caso sia necessario ritornare più valori, possiamo usare un array: [v1,v2, ] = function f(x,y) Esempio: function [minore, maggiore] = minmax(a,b,c) minore = min ([a,b,c]); maggiore = max([a,b,c]);

Invocazione 11 Una funzione può essere invocata in un programma attraverso il suo nome, seguito dagli argomenti fra parentesi rotonde La funzione viene quindi eseguita e il suo valore di ritorno viene calcolato. Esempio x = input('inserisci x: '); fx = fattoriale(x) if (f>220) y = input('inserisci y: '); fy=fattoriale(y)

I parametri 12 Definizioni: I parametri formali sono le variabili usate come argomenti e valore di ritorno nella definizione della funzione I parametri attuali sono i valori (o le variabili) usati come argomenti/valore di ritorno nella invocazione della funzione Esempio: function f=fattoriale(n) f=1 for i=1:n f ed n sono parametri formali f = f*i fx e 5 sono parametri attuali >> fx = fattoriale(5)

I parametri (2) 13 Qualsiasi tipo di parametri è ammesso (scalari, vettori, matrici, strutture, ecc.) I parametri attuali vengono associati a quelli formali in base alla posizione: il primo parametro attuale viene associato al primo formale, il secondo parametro attuale al secondo parametro formale, ecc. Un invocazione di funzione deve contenere un numero di parametri attuali identico al numero di parametri formali Esempio >> [x,y]=sumprod(4,5) function [s,p]=sumprod(a,b) s=a+b; p=a*b;

Esecuzione di una funzione 14 Quando una funzione viene eseguita, viene creato un workspace locale in cui vengono memorizzate tutte le variabili usate nella funzioni (inclusi i parametri formali) All interno delle funzioni non si può accedere al workspace principale (nessun conflitto di nomi) Quando la funzione viene eseguita, il workspace locale viene distrutto! Quando viene invocata una funzione: Vengono calcolati i valori dei parametri attuali di ingresso Viene creato un workspace locale per la funzione I valori dei parametri attuali di ingresso vengono copiati nei parametri formali all interno del workspace locale Viene eseguita la funzione Vengono copiati i valori di ritorno dal workspace locale a quello principale (nei corrispondenti parametri attuali) Il workspace locale viene distrutto

Esecuzione di una funzione: esempio 15 (1) >> x=3; (2) >> w=2; (3) >> r = funz(4); W principale dopo (2) function y = funz(x) y = 2*x; %(1 ) x = 0; %(2 ) z=4; %(3 ) x=w+1; %(4 ) x=3 w=2 W locale dopo(1 ) W locale (4 ) W principale dopo (3) x=4 y=8 x=3 w=2 W locale dopo(3 ) r= 8 x=0 y=8 W locale dopo (3) z=4 x=0 y=8 z=4 w=? errore

File funzione 16 Come nel caso degli script le funzioni possono essere scritti in file di testo sorgenti Devono avere estensione.m Devono avere lo stesso nome della funzione Devono iniziare con la parola chiave function Attenzione a non ridefinire funzioni esistenti exist( nomefunzione ) 0 se la funzione non esiste

Esempi 17 function [pres, pos]=cerca(x, v) p=0; pos=-1; for i=1:length(v) if v(i)==x p=p+1; pos(p)=i; pres=p>0; >> A=[1, 2, 3, 4, 3, 4, 5, 4, 5, 6] A = 1 2 3 4 3 4 5 4 5 6 >> [p, i]=cerca(4,a) p = 1 i = 4 6 8 Esercizio: implementare usando find()

Esempi (2) 18 function [t]=trasposta(m) [r,c]=size(m); for i=1:r for j=1:c t(j,i)=m(i,j); ; >> m=[1,2,3,4;5,6,7,8;9,10,11,12] m = 1 2 3 4 5 6 7 8 9 10 11 12 >> trasposta(m) ans = 1 5 9 2 6 10 3 7 11 4 8 12

Esempi (3) 19 >> P.ro=1; P.teta=pi/3 P = ro: 1 teta: 1.0472 >> Q=polar2cart(P) Q = x: 0.5000 y: 0.8660 >> R.to=1; R.teta=pi/3 R = to: 1 teta: 1.0472 >> Q=polar2cart(R)??? Reference to non-existent field 'ro'. Error in ==> polar2cart at 2 c.x=p.ro*cos(p.teta); ρ θ P function [c]=polar2cart(p) c.x=p.ro*cos(p.teta); c.y=p.ro*sin(p.teta); y x P

Ricorsione

Ricorsione 21 Che cos è la ricorsione? Un sottoprogramma P richiama se stesso (ricorsione diretta) Un sottoprogramma P richiama un altro sottoprogramma Q che comporta un altra chiamata a P (ricorsione indiretta) A cosa serve? È una tecnica di programmazione molto potente Permette di risolvere in maniera elegante problemi complessi

Programmazione ricorsiva 22 Per risolvere un problema attraverso la programmazione ricorsiva sono necessari alcuni elementi Caso base: caso elementare del problema che può essere risolto immediatamente Passo ricorsivo: chiamata ricorsiva per risolvere uno o più problemi più semplici Costruzione della soluzione: costruzione della soluzione sulla base del risultato delle chiamate ricorsive

Esempio: il fattoriale 23 Definizione: f(n) = n! = n*(n-1)*(n-2)* *3*2*1 Passo ricorsivo: f(n) = n*f(n-1) Caso base: f(0)=1 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1);

Funzionamento ricorsione 24 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric n:3 f:...

Funzionamento ricorsione 25 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric factric n:2 f:... n:3 f:...

Funzionamento ricorsione 26 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric factric factric n:1 f:... n:2 f:... n:3 f:...

Funzionamento ricorsione 27 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric factric factric factric n:0 f:... n:1 f:... n:2 f:... n:3 f:...

Funzionamento ricorsione 28 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric factric factric factric n:0 f: 1 n:1 f:... n:2 f:... n:3 f:...

Funzionamento ricorsione 29 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric factric factric n:1 f: 1 n:2 f:... n:3 f:...

Funzionamento ricorsione 30 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric factric n:2 f: 2 n:3 f:...

Funzionamento ricorsione 31 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric n:3 f: 6

Funzionamento ricorsione 32 function [f]=factric(n) if (n==0) f=1; else f=n*factric(n-1); factric n:3 f: 6

Esempio: Fibonacci 33 È una sequenza di numeri interi in cui ogni numero si ottiene sommando i due precedenti nella sequenza. I primi due numeri della sequenza sono per definizione pari ad 1. f 1 = 1 (caso base) f 2 = 1 (caso base) f n = f n-1 + f n-2 (passo ricorsivo) function [fib]=fiboric(n) if n==1 n==2 fib=1; else fib=fiboric(n-2)+fiboric(n-1);

Esempio: MCD 34 Algoritmo di Euclide se m = n, MCD(m,n) = m (caso base) se m > n, MCD(m,n) = MCD(m-n,n) (caso risorsivo) se m < n, MCD(m,n) = MCD(m,n-m) (caso risorsivo) Esempio: MCD(30,18) 30 18 12 18 12 6 6 6

Esempio: MCD 35 Algoritmo di Euclide se m = n, MCD(m,n) = m (caso base) se m > n, MCD(m,n) = MCD(m-n,n) (caso risorsivo) se m < n, MCD(m,n) = MCD(m,n-m) (caso risorsivo) Implementazione function [M]=MCDeuclidRic(m,n) if m==n M=m; else if m>n M = MCDeuclidRic(m-n,n); else M = MCDeuclidRic(m,n-m);

Problemi nell uso della ricorsione 36 Terminazione della catena ricorsiva È presente il caso base? Viene raggiunto sempre dalla catena di chiamate ricorsive? Esempi function [f]=factric(n) f=n*factric(n-1); Catena infinita di chiamate con argomento decrescente function [f]=factric(n) factric(n); Catena infinita di chiamate identiche

Problemi nell uso della ricorsione 37 Uso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente della memoria per la gestione degli spazi di lavoro delle chiamate generate In alcuni casi viene comunque preferita ad altri approcci per la sua eleganza e semplicità In altri casi, si può ricorrere ad implementazioni iterative Esempio function [fl]=fiblist(n) fl(1)=1; fl(2)=1; for k=3:n fl(k)=fl(k-2)+fl(k-1); Funzione iterativa che calcola i primi n numeri di fibonacci

Variabili funzione

Variabili funzioni 39 Matlab permette di assegnare a variabili valori di tipo funzione Un valore ti tipo funzione può essere assegnato a una variabile (quindi passarlo come parametro), detta handle L handle può essere applicato a opportuni argomenti per ottenere una invocazione della funzione

Assegnamento di un valore di tipo funzione 40 Handle di una funzione esistente Esempio >> seno=@sin seno = @sin >> seno(pi/2) ans = 1 f = @nome_funzione Handle di una funzione definita ex-novo f = @(x,y )<expr> x,y, sono i parametri della funzione <expr> è un espressione che calcola il valore della funzione Esempio >> sq=@(x)x^2 sq = @(x)x^2 >> sq(8) ans = 64

Funzioni di ordine superiore 41 Se un parametro di una funzione f è un handle (cioè contiene un valore di tipo funzione) allora f èunafunzione di ordine superiore L handle passato come parametro consente ad f di invocare la funziona passata Esempio: funzione map che applica una funzione f a tutti gli elementi conetenuti nel parametro vin e ritorna i risultati in vout function [vout]=map(f, vin) for i=1:length(vin) vout(i)=f(vin(i)); ; handle >> A=[1,2,3,4,5,6]; >> map(sq,a) ans = 1 4 9 16 25 36 Invoca la funzione passata come argomento

Esempio: funzione accumulatore 42 Funzione accumulatore: [x] =acc(f, a, u) applica cumulativamente l operazione binaria f (con elemento neutro u) a tutti gli elementi di a: f( f(f(f(u,a(1)),a(2)),a(3)),a(length(a))) function [x]=acc(f, a, u) x=u; for i=1:length(a) x=f(x, a(i)); Funzione sommatoria: function [s]=sommatoria(a) calcola la sommatoria degli elementi di a function [s]=sommatoria(a) som=@(x,y)x+y; s=acc(som,a,0);