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