MATLAB - Array e Struct
MATLAB - Array e Struct
MATLAB/Octave
Array, matrici, vettorizzazione e struct
Informatica B
Array e variabili
-2-
Array e variabili
! L’unità fondamentale di dati in MATLAB è l’array
! Una variabile in MATLAB è una regione di memoria che
contiene un array
! Ha un nome definito dall’utente
! Per i nomi valgono regole simili a quelle del C
! C è un linguaggio a tipizzazione forte
! Le variabili vanno dichiarate prima dell’uso
! MATLAB è un linguaggio a tipizzazione debole
! Le variabili vengono create assegnando ad esse dei valori
! Il loro tipo è determinato dal tipo dei valori assegnati
>> x = [1 2 3];
>> whos x;
Name Size Bytes Class Attributes
x 1x3 24 double
-3-
Tipo double
-4-
Tipo char
-5-
Creazione e inizializzazione di una
variabile
! Le variabili sono create al momento
dell’inizializzazione
! Modi di inizializzazione
! Assegnamento
! Lettura dati da tastiera
! Lettura da file
-6-
Assegnamento
! variabile = espressione
! Esempi
! a = [0 7+1]; contenuto di a
! b = [a(2) 5 a];
secondo elemento di a
! Risultato
! a = [0 8]
! b = [8 5 0 8]
! Non tutti gli elementi devono essere specificati alla
creazione…
! c(2, 3) = 5; 0 0 0
0 0 5
-7-
Assegnamento (2)
! L’array può essere esteso successivamente …
! d = [2 5]; d(4)=2; d = [2 5 0 2]
! Operatore di trasposizione
! g = d’; 2
5
0
2
! Creare un vettore enumerando i valori di un insieme:
uso dell’operatore ‘:’
! x = 1:2:10; x = [1 3 5 7 9]
! n = 1:3; n = [1 2 3]
1 1
! m = [n’ n’] 2 2
3 3
-8-
Tabella delle funzioni predefinite
Funzione Significato
zeros (n) Genera una matrice nxn di zeri
zeros (m,n) Genera una matrice mxn di zeri
zeros (size(arr)) Genera una matrice di zeri della stessa dimensione di arr
ones(n) Genera una matrice nxn di uno
ones(m,n) Genera una matrice mxn di uno
ones(size(arr)) Genera una matrice di uno della stessa dimensione di arr
eye(n) Genera la matrice identità nxn
eye(m,n) Genera la matrice identità mxn
length(arr) Ritorna la dimensione più lunga del vettore
size(arr) Ritorna un vettore [r c] con il numero r di righe e c di colonne
della matrice; se arr ha più dimensioni ritorna array con
numero elementi per ogni dimensione
v(end) ultimo elemento di vettore v; ultimo elemento dell’ultima riga
m(end, end) di matrice m; la costante end, come indice in un array, denota il
più alto valore possibile dell’indice
-9-
Funzioni predefinite
! Esempi 0 0
! a = zeros(2); 0 0
! b = zeros(2,3); 0 0 0
0 0 0
! c = [1 2; 3 4];
! d = zeros(size(c)); 0 0
0 0
- 10 -
Esempio dalla I prova in itinere 2013
Qui lo facciamo in MATLAB
- 12 -
Soluzione parte 2
- 13 -
Soluzione parte 3, versione 1
% uso di A
A = zeros(1,C);
for jj=1:C
for ii=1:R
if (mod(M(ii,jj), 2)==0)
A(jj)++;
end
end
end
maxVal = A(1);
for ii=2:C
if (A(ii)>maxVal)
maxVal=A(ii);
end
end
maxPari = 0;
for jj=1:C
nPariColonna = 0;
for ii=1:R
if (mod(M(ii,jj), 2)==0)
nPariColonna++;
end
end
if(nPariColonna > maxPari)
maxPari = nPariColonna;
end
end
- 15 -
sottoarray: applicazione a vettori
>> v=[6 8 4 2 4 5 1 3]
v = 6 8 4 2 4 5 1 3
>> v([1 4 7]) primo, quarto settimo elemento
ans = 6 2 1
- 16 -
sottoarray: applicazione a matrici
m = 9 8 7
6 5 4
3 2 1
0 11 12
0 0 0 tutti gli elementi sulle righe 1 e 4 e sulle
>> m([1 4], [2 3]) colonne 2 e 3
ans = 8 7
11 12
>> m(1:2:5, 1:end) tutti gli elementi delle righe 1, 3 e 5
ans = 9 8 7
3 2 1
0 0 0
>>>> m(1:2:5, :) notazione ‘:’ abbreviata per 1:end, cioè tutti i
ans = 9 8 7 valori di quell’indice
3 2 1
0 0 0
>> m(2:2:4, :) = [-1 -2 -3; -4 -5 -6];
>> m
m = 9 8 7 uso della notazione dei sottoarray per
-1 -2 -3 individuare elementi oggetto di assegnamento
3 2 1
-4 -5 -6
0 0 0
>> - 17 -
Uso di uno scalare per assegnare valori a un array
! Esempio 3 3 3
! m(1:4, 1:3) = 3 3 3 3
3 3 3
3 3 3
- 18 -
Esempio da un tema d’esame
- 19 -
uso dell’array vuoto [] per cancellare elementi di un array
Un array vuoto [] assegnato a un elemento di un vettore non crea un ‘buco’
ma cancella un elemento e ricompatta il vettore
Un array vuoto [] non è assegnabile a singoli elementi di matrici (non si possono “creare buchi”)
È assegnabile a intere righe o colonne di matrici, che vengono cancellate (ricompattando la matrice)
- 20 -
Array: memorizzazione nella RAM
...
1
3
1 2
5
3 4
2
5 6
4
6
...
- 21 -
Array: forma linearizzata
! Si può accedere a un array a più dimensioni come se
ne avesse una sola
! Usando un unico indice si segue l’ordine della
memorizzazione
! Da NON usare nella programmazione
! ma aiuta a capire certi costrutti....
>> a = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
a =
1 2 3
4 5 6
7 8 9
10 11 12
>> a(3, 2)
ans =
8
>> a(10)
ans =
6
>>
- 22 -
Variabili predefinite
- 23 -
Variabili predefinite più comuni
Variabile Scopo
i, j contiene il valore i ( − 1)
- 24 -
Operazioni con scalari e array
1 2 2 3 2 6
! a= b= a .* b=
3 4 5 7 15 28
1 2 2 3 12 17
! a= 3 4 b= 5 7 a*b = 26 37 (a * b)ij = ∑k aik * bkj
- 25 -
Operazioni tipiche per gli array
Operazione Sintassi Commenti
Matlab
Array addition a+b Array e matrix addition sono
identiche
Array subtraction a–b Array e matrix subtraction sono
identiche
Array multiplication a .* b Ciascun elemento del risultato è
pari al prodotto degli elementi
corrispondenti nei due operandi
Matrix multiplication a*b Prodotto di matrici
Array right division a ./ b risultato(i,j)=a(i,j)/b(i,j)
Array left division a .\ b risultato(i,j)=b(i,j)/a(i,j)
Matrix right division a/b a*inversa(b)
Matrix left division a\b inversa(a)*b
Array exponentiation a .^ b risultato(i,j)=a(i,j)^b(i,j)
- 26 -
Matrix left division
! di conseguenza, x = A-1B=inversa(A)*b=A\B
- 27 -
Altre funzioni
Funzione Scopo
mean(x) se x è un vettore ritorna uno scalare uguale alla media dei valori di x; se x è una
matrice, ritorna il vettore contentente le medie dei vettori colonna di x;
- 28 -
funzioni min (e anche max) applicate a vettori e matrici
>> b = [4 7 2 6 5]
b = 4 7 2 6 5
(con un solo risultato) dà il valore del minimo
>> min(b)
ans = 2
>> [x y]=min(b) con due risultati dà anche la posizione del minimo
x = 2
y = 3
>>
>> [x y]=min(a) per una matrice, con due risultati dà due vettori dei valori
x = 22 25 21 minimi nelle colonne e della loro posizione (riga)
y = 4 2 1
>>
- 29 -
Problema I prova 2013, parte 3
nuova soluzione
N = ~mod(M, 2); % N è la matrice che contiene 1 in
% corrispondenza degli elementi di M
% divisibili per 2
A = sum(N); % A è un vettore che contiene la somma degli
% elementi di ciascuna colonna di N
maxVal = max(A);
- 30 -
Tipo di dato logico
33
Vettori e stringhe
! Esempi:
! [1 0; -2 1] < 0 dà [0 0; 1 0] ([false false; true false])
! [1 0; -2 1] >= [2 -1; 0 0] dà [0 1; 0 1]
! Si possono confrontare stringhe di lunghezza uguale
! ‘pippo’==’pluto’ dà [1 0 0 0 1]
34
Operatori logici
! Forma generale: a OP1 b oppure OP2 a
! a,b possono essere variabili, costanti, espressioni da
valutare, scalari o vettori (dimensioni compatibili)
! OP1: AND (&& o &), OR (|| o |), XOR (xor) e OP2: NOT (~)
! Se a e b sono numerici verranno interpretati come
logici:
! 0 come false
! tutti i numeri diversi da 0 come true
a
b
a AND b
a OR b
NOT a
a XOR b
fals fals false
false
true
false
e
e
fals true
false
true
true
true
e
true
fals false
true
false
true
e
true
true
true
true
false
false
35
&& vs & e || vs |
37
Esempi
38
Vettori logici e selezione (1)
42
Funzioni logiche
Nome della Elemento restituito
funzione
all(x) un vettore riga, con lo stesso numero di colonne della matrice x, che contiene 1, se la
corrispondente colonna di x contiene tutti elementi non nulli, o 0 altrimenti;
NB: applicato a un vettore dà un solo valore logico, 1 sse tutti gli elementi sono veri
any(x) un vettore riga, con lo stesso numero di colonne della matrice x, che contiene 1, se la
corrispondente colonna di x contiene almeno un elemento non nullo, 0 altrimenti;
NB: applicato a un vettore dà un solo valore logico, 0 sse tutti gli elementi sono falsi
isinf(x) un array delle stesse dimensioni di x con 1 dove gli elementi di x sono ‘inf’, 0 altrove
isnan(x) un array delle stesse dimensioni di x con 1 dove gli elementi di x sono ‘NaN’, 0 altrove
finite(x) un array delle stesse dimensioni di x, con 1 dove gli elementi di x sono finiti, 0 altrove
- 43 -
Vettorizzazione come sostituto
più efficiente del for
- 44 -
Vettorizzazione (1)
! La versione con il for può essere fino a 15 volte più lenta della versione
con la vettorizzazione!
45
Vettorizzazione (2)
! Riprendiamo l’esempio
! b = a>5
! a(b)=sqrt(a(b))
! Esecuzione dello stesso calcolo con i cicli
[r, c]=size(a); %usata in questo modo size dà righe e colonne di una matrice
for h = 1:r
for k = 1:c
if a(h, k)>5
a(h, k)=sqrt(a(h, k));
end
end
end
48
Creazione di una struttura campo per
campo
! Esempio: la struttura studente
! studente.nome = ‘Giovanni Rossi’;
! studente.indirizzo = ‘Via Roma 23’;
! studente.citta = ‘Cosenza’;
! studente.media = 25;
! whos studente
Name Size Bytes Class Attributes
studente 1x1 568 struct
! %aggiungo un nuovo studente… -> array 1x2
! studente(2).nome = ‘Giulia Gatti’;
! studente(2).media = 30;
! Nota: quando un elemento viene definito, tutti i suoi campi
sono creati e inizializzati a valore nullo (vettore vuoto [])
49
Creazione di una struttura mediante la
funzione struct
! Consente di preallocare una struttura o un array di
strutture
! str_array = struct(‘campo1’, val1, ‘campo2’, val2, …)
! Esempio
rilievoAltimetrico =
latitudine: 20
longitudine: 30
altitudine: 1300
50
Creazione di array di strutture
52
Uso dei dati nelle strutture
54
Esercizio
55
Soluzione (1)
56
Soluzione (2)
jj=1;
for ii=1:length(arch)
%attenzione: la condizione deve essere scritta sulla stessa linea…
if arch(ii).latitudine>=10&&arch(ii).latitudine<=80 &&
arch(ii).longitudine>=30&&arch(ii).longitudine<=60
elemSelez(jj) = arch(ii).altitudine;
jj=jj+1;
end
end
disp(['la media degli elementi selezionati e` ' num2str(mean(elemSelez))]);
57