Matlab/Octave - Esercitazione 8 - Informatica...

39
Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012 Salvo Daniele Valente Dipartimento di Elettronica e Informazione Facoltà di Ingegneria Industriale Laurea in Ingegneria Energetica, Meccanica e dei Trasporti tipi di dato array e matrici assegnamento variabili predefinite operatori e funzioni predefinite file di script istruzioni di input/output da tastiera e da file Matlab/Octave - Esercitazione 8

Transcript of Matlab/Octave - Esercitazione 8 - Informatica...

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Facoltà di Ingegneria IndustrialeLaurea in Ingegneria Energetica, Meccanica e dei Trasporti

‣ tipi di dato‣array e matrici‣assegnamento‣variabili predefinite‣operatori e funzioni predefinite‣file di script‣ istruzioni di input/output da tastiera e da file

Matlab/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Interfaccia utente

3

command windw: consente di eseguire comandi, lanciare script e controllare lo stato delle variabili in uso.All’avvio di MATLAB, sulla command window compare il carattere di attesa (prompt) ed il cursore lampeggiante.

workspace: visualizza tutte le variabili globali in uso, il loro valore ed i rispettivi valori max e min

command history: mantiene traccia dei comandi digitati nella command window.

MATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Richiami teorici

4

‣Un programma in MATLAB/Octave non viene trasformato in codice eseguibile dal calcolatore. Esso viene interpretato direttamente dall’ambiente di lavoro MATLAB/Octave.

‣Non occorre dichiarare variabili. Esse vengono definite automaticamente nel momento in cui vengono usate per la prima volta.

‣ Il tipo di variabile è dinamico, può cambiare durante l’esecuzione del programma per effetto di assegnamenti diversi.

‣MATLAB/Octave è focalizzato sulla trattazione di problemi di natura numerica, mentre C può trattare qualsiasi tipo di problema.

‣ L’unità fondamentale di dato è l’array. Un array è una collezione ordinata di valori. Gli array si dividono in:

‣ vettori: sono monodimensionali e caratterizzati da una sola riga o colonna;

‣matrici: sono multidimensionali;

‣ gli scalari sono un tipo particolare di vettore con una sola riga e una sola colonna.

MATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Esercizio 1

5

Digitare sulla command window le seguenti istruzioni:

- a = 2.5*2;- a- 3.5*7;- b = sqrt(100);- b = sqrt(100)- a+b- a-b- a/b- a^b - c = i- d = j- e = pi- f = eps- g = ‘Esercizio numero 1’- whos g

- ripetere tutte le istruzioni dopo aver digitato il comando: format long

MATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Esercizio 1 - Soluzione

6

>> a = 2.5*4;Digitando sulla command window l’istruzione:

MATLAB/Octave - Esercitazione 8

Notiamo che MATLAB non fornisce nessuna risposta sul risultato dell’operazione ma se osserviamo il Workspace noteremo che è stata creata una variabile di nome a.Questo succede perchè il “;” alla fine dell’istruzione sopprime la visualizzazione del risultato sulla command window.

>> aa = 10

Digitando solamente il nome della variabile appena creata senza ;, il risultato sarà:

avendo omesso il punto e virgola, MATLAB ci mostra il contenuto della variabile.

>> 3.5*7;

La command window di MATLAB può essere utilizzata come una grande calcolatrice per fare calcoli rapidi. Digitiamo l’istruzione:

come già detto prima, il risultato dell’operazione non viene visualizzato sulla command window, ma nel Workspace viene creata una nuova variabile di nome ans.

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Esercizio 1 - Soluzione

7

ans sta per answer e contiene sempre l'ultimo valore non esplicitamente assegnato dall'utente ad una variabile.

MATLAB/Octave - Esercitazione 8

Si noti che per utilizzare la funzione sqrt() non è stato necessario includere alcuna libreria o header partiolare.

MATLAB mette a disposizione una vastissima gamma di funzioni predefinite che possono essere utilizzate semplicemente richiamandole tramite uno script o dalla command window.

Creiamo una nuova variabile b e gli assegniamo il valore specificato nella traccia.>> b = sqrt(100);

Se vogliamo compiere la stessa operazione ma visualizzare contemporaneamente il suo risultato, basterà omettere il ; alla fine dell’espressione.

>> b = sqrt(100)b = 10

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

8

Per sapere come utilizzare una qualsiasi funzione predefinita di MATLAB digitare il suo nome sulla command window anteponendo la parola help.

>> help sqrt SQRT Square root. SQRT(X) is the square root of the elements of X. Complex results are produced if X is not positive. See also sqrtm, realsqrt, hypot.

Overloaded methods: codistributed/sqrt

Reference page in Help browser doc sqrt

Esercizio 1 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

9

Vediamo ora i risultati delle successive istruzioni:

>> a+bans = 20

>> a-bans = 0

>> a/bans = 1

>> a^bans = 1.0000e+10

il valore della variabile di supporto ans viene aggiornata ad ogni istruzione.

Esercizio 1 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

10

MATLAB definisce un insieme di variabili predefinite che rappresentano importanti costanti matematiche.Il valore di queste costanti è memorizzato in variabili e, per questo, possono essere modificate dall’utente. Nonostante questa operazione sia consentita, è fortemente consigliato non modificarne il valore per non vere spiacevoli sorprese nel momento in cui vengono utilizzate.

Il valore di default di tali variabili viene ripristinato ad ogni avvio di MATLAB o tramite il comando clear.>> c = ic = 0 + 1.0000i

>> d = jd = 0 + 1.0000iin MATLAB il valore dell’unità immaginaria è contenuto sia nella variabile i che in j.Questo avviene perché nelle convenzioni ingegneristiche si usa indicarla con j mentre in quelle matematiche con i.

!

"1

Esercizio 1 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

11

Molto spesso gli indici dei cicli for e le variabili utilizzate come contatore sono chiamati con le lettere i e j. E’ consigliabile non utilizzare questa notazione per non modificare il valore delle unità immaginare ma sostituire con una notazione del tipo: ii o jj.

>> e = pie = 3.1416

Nella variabile pi è contenuto il valore di !.

>> f = epsf =

2.2204e-16

La variabile eps, invece, contiene l’epsilon macchina, ovvero il numero più piccolo rappresentabile da MATLAB sulla macchina sui cui sta girando.

Esercizio 1 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

12

Come già anticipato, in MATLAB non è necessario dichiarare una variabile per poterla utilizzare. Digitando la riga di codice:

>> g = ‘Esercizio numero 1’;

verrà creata automaticamente la variabile g di tipo char che conterrà la stringa specificata. Possiamo avere un riscontro di questa inizializzazione automatica digitando il comando:

>> whos g Name Size Bytes Class Attributes g 1x18 36 char

Omettendo il nome della variabile, il comando whos ci restituisce informazioni su tutte le variabili contenute nel Workspace.>> whos Name Size Bytes Class Attributes a 1x1 8 double ans 1x1 8 double ...

Esercizio 1 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

13

>> whos Name Size Bytes Class Attributes a 1x1 8 double ans 1x1 8 double b 1x1 8 double c 1x1 16 double complex d 1x1 16 double complex e 1x1 8 double f 1x1 8 double g 1x18 36 char

Cosa cambia se ripetiamo le operazioni precedenti dopo aver digitato il comando:>> format long

?

Esercizio 1 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione

Esercizio 2

14

Riportiamo MATLAB alla visualizzazione standard con il comando: format short.Digitare sulla command window le seguenti istruzioni:1) row = [1 2 3]2) row2 = [1, 2, 3]3) col = [1; 2; 3]4) col2 = row’5) line = [1:10]6) line = [1:0.5:10]7) line = linspace(0,1,5)8) size(row)9) length(row)10) a = line(4)11) line(1)12) line(0)13) line(end)14) whos

MATLAB/Octave - Esercitazione 8

Informatica B - Esercitazione 8 del 24/11/2011

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

15

Digitiamo sulla command window le prime quattro istruzioni riportate nella traccia ed osserviamo i risultati che produce Matlab:

>> col2 = row'col2 = 1 2 3

>> row2 = [1,2,3]row2 = 1 2 3

>> row = [1 2 3]row = 1 2 3

>> col = [1;2;3;]col = 1 2 3

I vettori riga row e row2 sono identici tra loro.Quando si crea un vettore roga in Matlab, infatti, è indifferente separare gli elementi che esso contiene con spazi o righe. Sono due istruzioni esattamente equivalenti.

Anche i vettori colonna col e col2 sono identici tra loro.La creazione di una vettore colonna, infatti può essere fatta separando gli elementi che esso contiene con il delimitatore di riga “;” o trasponendo un vettore riga.

“;” operatore di trasposizione: equivalente della trasposizione matematica di matrici e vettori.

Esercizio 2 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

16

In Matlab è possibile creare array composti da N valori consecutivi equispaziati tra loro tramite un’unica istruzione. Digitiamo le righe 5) 6) 7) dell’esercizio:

>> line = [1:10]line = 1 2 3 4 5 6 7 8 9 10

Questo comando genera un vettore riga di 10 elementi consecutivi equispaziati tra loro con passo incrementale uguale ad 1. Il passo può essere cambiato interponendolo tra il valore iniziale ed il valore finale:

>> line = [1:0.5:10]line = Columns 1 through 12 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000 4.5000 5.0000 5.5000 6.0000 6.5000 Columns 13 through 19 7.0000 7.5000 8.0000 8.5000 9.0000 9.5000

E’ stato generato un vettore riga di 10 elementi con passo = 0.5.

Esercizio 2 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

17

Quando si vuole suddividere un intervallo in un determinato numero di passi, è utile utilizzare la funzione predefinita linspace.

>> line = linspace(0,1,5)line = 0 0.2500 0.5000 0.7500 1.0000

linspace(x1, x2, N) genera un vettore riga di N elementi linearmente equispaziati tra x1 ed x2.Consultare help linspace.

Esercizio 2 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

18

Riepilogo...

Vettore RIGA:‣x = [valore_minimo:incremento:valore_massimo]; in questo caso la presenza delle parentesi è facoltativa;‣x = [valore1 valore2 ... valoreN];‣x = [valore1, valore2, ..., valoreN]; in questo caso la presenza delle parentesi è fondamentale.

Vettore COLONNA:‣x = [valore1; valore2; ...; valoreN]; oppure si può utilizzare la trasposizione del vettore riga.‣x = [valore1 valore2 ... valoreN]’;‣x = [valore_minimo:incremento:valore_massimo]’;

‣Quando si usa la trasposizione, l’uso delle parentesi è obbligatorio‣A differenza del C, gli indici di tutti i tipi di array, in Matlab, iniziano da 1 e non da 0.

Esercizio 2 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

19

Vediamo altre funzioni predefinite per la gestione di array:

>> size(row)ans = 1 3

>> length(row)ans = 3

size(x) restituisce un vettore che indica le dimensioni dell’array x.Se x è una matrice, ne indica le righe e le colonne; se x è un array multidimensionale ne indicherà tutte le dimensioni coinvolte.length(x) restituisce un solo numero che indica la dimensione massima dell’array x.Consultare help size, help length

Esercizio 2 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

20

Vediamo adesso alcuni esempi di istruzioni che permettono di recuperare alcuni (o tutti) i dati contenuti negli array.Eseguiamo le operazioni sull’array line che è così composto:

>> lineline = 0 0.2500 0.5000 0.7500 1.0000

>> a = line(4)a = 0.7500

>> a = line(1)a = 0

Usiamo questa istruzione per accedere alla componente di un vettore, ad esempio alla quarta, e assegnare alla variabile a tale valore.

Esercizio 2 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

21

La numerazione dei valori inizia da 1 e non da zero, infatti, digitando...

>> line(0)??? Subscript indices must either be real positive integers or logicals.

...Matlab restituisce un errore!

Esistono in Matlab le parole chiave start e end per accedere rispettivamente al primo e all'ultimo elemento di un vettore.NB: Queste parole chiave sono riconosciute da Matlab in base alla versione e al sistema operativo utilizzato.

>> line(start)ans = 0

>> line(end)ans = 1

Esercizio 2 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

22

>> whos Name Size Bytes Class Attributes

a 1x1 8 double ans 1x1 8 double col 3x1 24 double col2 3x1 24 double line 1x5 40 double row 1x3 24 double row2 1x3 24 double

Esercizio 2 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Esercizio 3

23

Utilizzare la command window per:

-creare due vettori riga e e o contenenti rispettivamente i primi dieci numeri naturali pari ed i primi dieci dispari.

-realizzare le seguenti operazioni tra vettori:-prodotto componente per componente

-elevazione al quadrato di ogni componente del vettore e;

-elevazione al cubo di ogni componente del vettore o;

-somma algebrica dei due vettori;

-prodotto scalare tra i due vettori;

MATLAB/Octave - Esercitazione 8

(e, o) = (e1o1, e2o2, ..., e10o10)

!

e2

1, e2

2, ..., e2

10

"

!

o3

1, o3

2, ..., o3

10

"

o+ e = (e1 + o1, e2 + o2, ..., e10 + o10)

< e, o >= (e1o1 + e2o2+, ...,+e10o10)

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

24

>> e = 0:2:18e = 0 2 4 6 8 10 12 14 16 18

>> o = 1:2:19o = 1 3 5 7 9 11 13 15 17 19

Calcolo il prodotto componente per componente:

>> prodotto_cc = e.*oprodotto_cc = 0 6 20 42 72 110 156 210 272 342

Il prodotto componente per componente (attenzione: differente sia dal prodotto scalare che dal prodotto vettoriale!), si esegue usando la sintassi "punto", ovvero e.*o.Se i due vettori non hanno la stessa dimensione, o lo stesso orientamento (riga, colonna) Matlab genera un errore.

Esercizio 3 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

25

>> e_quad = e.^2e_quad = 0 4 16 36 64 100 144 196 256 324

Anche se si vuole calcolare il quadrato di ogni componente di un vettore, si utilizza "punto", ovvero e.^2. Se non si usasse questo tipo di sintassi Matlab restituirebbe un errore perché l’operazione di elevazione al quadrato non è definita sui vettori ma solo sulle matrici quadrate.

>> e_quad = e^2??? Error using ==> mpowerInputs must be a scalar and a square matrix. >> o_cub = o.^3o_cub = 1 27 125 343 729 1331 2197 3375 4913 6859

Verificare che la sintassi di elevazione a potenza (e qualunque orazione su vettori in generale) non varia tra vettore riga e vettore colonna.

Esercizio 3 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

26

>> somma = o + esomma = 1 5 9 13 17 21 25 29 33 37

Per realizzare la somma degli elementi di due vettori non è stato necessario implementare alcun ciclo for. Sono poche le operazioni effettuate su array che richiedono l’implementazione di cicli iterativi. La maggior parte delle volte Matlab mette a disposizione strumenti che implementano il ciclo internamente.

>> prodotto_sc = e*o’prodotto_sc = 1230

Come per tutte le operazioni precedenti, anche in questo caso non è stato necessario implementare alcun ciclo.Rendendo il vettore o un vettore colonna, otteniamo il prodotto scalare tramite la semplice operazione di moltiplicazione.

Esercizio 3 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Esercizio 4

27

Utilizzare la command window per:

-creare due matrici:

-realizzare le seguenti operazioni:-somma delle matrici;-prodotto tra le matrici;-prodotto termine a termine tra le matrici;-cercare il massimo di ogni colonna di A;-cercare il minimo assoluto della matrice A.*B;

-creare una matrice 6x4 di numeri casuali C con la funzione rand e:

-porre in D l’arrotondamento per eccesso dei numeri di C;-porre in E l’arrotondamento per difetto dei numeri di C;

MATLAB/Octave - Esercitazione 8

A =

!

"

1 2 3

4 5 6

7 8 9

#

$

, B =

!

"

1 0 0

0 1 0

0 0 1

#

$

MATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

28

Creo le matrici separando le righe tra loro con il delimitatore di riga “;”>> A = [1 2 3; 4 5 6; 7 8 9]A = 1 2 3 4 5 6 7 8 9

>> B= [1 0 0; 0 1 0; 0 0 1]B = 1 0 0 0 1 0 0 0 1

Analogamente ai vettori, la somma tra matrici si calcola senza ricorrere ad alcun ciclo ma semplicemente:>> somma = A + Bsomma = 2 2 3 4 6 6 7 8 10

Esercizio 4 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

29

Calcolo il prodotto tra matrici semplicemente usando l’operatore “*”...

>> prodotto = A*B

prodotto =

1 2 3 4 5 6 7 8 9

...ed il prodotto componente per componente in maniera analoga ai vettori.

>> prodotto_cc = A.*B

prodotto_cc =

1 0 0 0 5 0 0 0 9

Se A e B fossero state due matrici con dimensioni rispettivamente 3x2 e 2x3, quale sarebbe stata l’istruzione corretta per calcolare il prodotto elemento per elemento tra loro?

Esercizio 4 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

30

Calcolo il massimo di ogni colonna della matrice A utilizzando la funzione predefinita max:

>> max_A = max(A)

max_A = 7 8 9

Se x è un vettore, max(x) restituisce l’elemento più grande di x. Se x è una matrice, la funzione restituisce un vettore contenente il massimo di ogni colonna.Consultare help max

Dato che la funzione max ci restituisce il massimo di ogni colonna della matrice, per calcolarne il massimo assoluto sarà necessario chiamarla due volte in maniera annidata:

>> abs_max_prod = max(max(prodotto))

abs_max_prod = 9

Esercizio 4 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

31

La funzione max più interna agisce sulle colonne della matrice prodotto e restituisce il vettore [7 8 9]. Fornendo questo vettore in input alla funzione max più esterna otteniamo il massimo assoluto: 9.

prodotto =

1 2 3 4 5 6 7 8 9

7 8 9 9

Infatti...

>> abs_max_prod = max(max(prodotto))

abs_max_prod = 9

Esercizio 4 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

32

Una soluzione alternativa per calcolare il massimo assoluto di un amatrice è “srotolare” la matrice per farla diventare un vettore. Dopodiché si applica la funzione max una sola volta.

>> abs_max_B = max(prodotto(:))

abs_max_B = 9

L’operatore “:” usato come indice unico di una matrice (o di un array in generale) la converte in un vettore colonna.>> prodotto(:)

ans =

1 4 ... 6 9

Esercizio 4 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

33

Creo la matrice C utilizzando la funzione predefinita rand:

>> C = rand(6, 4)C = 0.0855 0.4886 0.5211 0.3674 0.2625 0.5785 0.2316 0.9880 0.8010 0.2373 0.4889 0.0377 0.0292 0.4588 0.6241 0.8852 0.9289 0.9631 0.6791 0.9133 0.7303 0.5468 0.3955 0.7962

Pongo in D l’arrotondamento per eccesso di C e in E l’arrotondamento per difetto:

>> D = ceil(C)D = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

>> E = floor(C)E = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Esercizio 4 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

34

L’arrotondamento per eccesso si opera con la funzione ceil (soffitto), mentre quello per difetto con la funzione predefinita floor (pavimento).Dai risultati possiamo dedurre che la funzione rand restituisce valori casuali compresi tra 0 ed 1.Il suo alter-ego randn genera numeri casuali con distribuzione gaussiana.

rand(m, n) restituisce una matrice mxn contenente numeri casuali compresi nell’intervalli [0, 1].ceil(x) arrotonda gli elementi di x verso +inf.floor(x) arrotonda gli elementi di x verso -inf.

Consultare help round, roundn, ceil, floor

Distribuzione uniforme

-2,5 -2 -1,5 -1 -0,5 0 0,5 1 1,5 2

-1,5

-1

-0,5

0,5

1

valori assunti

probabilità

Distribuzione gaussiana

Esercizio 4 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

35

In MATLAB possono essere scritti dei programmi veri e propri usando l’editor incorporato nell’ambiente di lavoro.

Cliccando sul pulsante new M-file si apre la finestra dell’editor di script.

File di scriptMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

Esercizio 5

36

Creare un file di script che:generi una matrice M quadrata di dimensione N (ove N è un dato chiesto in input all'utente) con numeri casuali estratti da una distribuzione uniforme nell'intervallo [0,1] e calcolare:- un vettore contenente la somma degli elementi di ciascuna colonna;- un vettore contenente la somma degli elementi di ciascuna riga;- un vettore contenente la somma del quadrato degli elementi di ciascuna riga;- il massimo degli elementi della matrice;- la somma di tutti gli elementi della matrice;

Salvare sul file “dati.mat” tutte le variabili utilizzate nel programma.

MATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

37

Chiedo in input la dimensione e genero la matrice M.

N = input('dimensione = ');

Con un solo comando, Matlab, visualizza la stringa compresa tra le virgolette e memorizza il risultato nella variabile N. M = rand(N);

Per calcolare la somma degli elementi di un array, Matlab mette a disposizione una funzione che ci evita di implementare cicli for ed agevola l’operazione.La funzione predefinita sum opera per colonne e restituisce un vettore contenente la somma dei valori calcolati lungo le colonne della matrice M.

somma_col = sum(M);

Se x è un vettore, sum(x) restituisce la somma dei suoi elementi. Se x è una matrice, la funzione restituisce un vettore contenente la somma operata lungo le colonne.

Consultare help sum

Esercizio 5 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

38

Per calcolare la somma delle righe di uso sempre la funzione sum la sulla matrice trasposta M’.somma_rig = sum(M');

Con la stessa tecnica calcolo la somma del quadrato degli elementi.Si noti che l’uso della sintassi “.^2” è fondamentale per avere il risultato corretto.somma_rig_quad = sum(M'.^2);

Calcolo il massimo assoluto...max_M = max(max(M)); % max_M = max(M(:));

...e la somma di tutti gli elementi.somma_M = sum(sum(M)); % somma_M = sum(M(:));

Anche il salvataggio di tutte le variabili globali presenti nel workspace è molto facilitata in Matlab e si implementa con una sola riga di codice:save dati

L’istruzione save dati salva nel file binario dati.mat il contenuto di tutte le variabili attive in memoria in quel momento.

Esercizio 5 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

39

l formato .mat è un formato binario proprietario di Matlab.Questo implica che non è un formato adatto per scambiare dati con altri ambienti di sviluppo ma che fornisce la massima flessibilità e facilità di utilizzo all’interno dell’ambiente Matlab.

Per capire la versatilità di questa istruzione provare a digitare il comando clear all % cancella tutto il contenuto del workspace

e a ricaricare tutte le variabili tramite:load(dati)

Tutto il workspace è stato ricostruito nella forma esatta in cui lo si è salvato!

save salva tutte le variabili del workspace su file.save FILENAME salva tutte le variabili del workspace corrente in un file binario in formato proprietario di Matlab con il nome di FILENAME.mat.save(FILENAME, variabili) salva solo le variabili specificate.

Consultare help save

Esercizio 5 - SoluzioneMATLAB/Octave - Esercitazione 8

Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 8 del 30/11/2012

Salvo Daniele Valente

Dipartimento di Elettronica e Informazione

40

clear allclose allclc N = input('dimensione = '); M = rand(N);somma_col = sum(M);somma_rig = sum(M'); somma_rig_quad = sum(M'.^2); max_M = max(max(M)); %max_M = max(M(:));somma_M = sum(sum(M)); %somma_M = sum(M(:)); save dati

Esercizio 5 - Codice completo

Esercizio 5 - SoluzioneMATLAB/Octave - Esercitazione 8