Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Size
1x1
Bytes
1
Class
logical
Attributes
a=true;
a un vettore 1x1 che occupa 1 byte e appartiene alla
classe tipo logico
2
Operatori relazionali
Gli operatori relazionali operano su tipi numerici o stringhe
Forma generale: a OP b
a,b possono essere espressioni aritmetiche, variabili,
stringhe (della stessa dimensione)
OP: ==, ~=, >, >=, <, <=
Esempi:
3<4
3==4
A<B
true (1)
false (0)
true (1)
Note
Non confondere == e =: esattamente come in C
== un operatore di confronto
= un operatore di assegnamento
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]
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 (~)
a AND b
a OR b
NOT a
a XOR b
false false
false
false
true
false
false true
false
true
true
true
true false
false
true
false
true
true true
true
true
false
false
&& vs & e || vs |
&& (||) funziona con gli scalari e valuta prima
loperando pi a sinistra. Se questo sufficiente per
decidere il valore di verit dellespressione non va
oltre
a && b: se a falso non valuta b
a || b: se a vero non valuta b
Esempi
Hai tra 25 e 30 anni?
(eta>=25) & (eta<=30)
Con i vettori:
Voto = [ 12, 15, 8, 29, 23, 24, 27 ]
C = (Voto > 22) & (Voto < 25) -> C = [ 0 0 0 0 1 1 0 ]
pi concisamente
10
>> sqrt(a(b))
ans = 2.6458
2.8284
2.4495
3.0000
>> a(b)=sqrt(a(b))
a = 1.0000 2.0000
4.0000 5.0000
2.6458 2.8284
>>
11
3.0000
2.4495
3.0000
poi
12
>> b(b>5)
ans =
6
7
8
9
>> a(a>5)=b(b>5)
a=
1 2 3
4 5 8
6 7 9
>>
Find
ind = find(x) restituisce gli indici degli elementi non nulli
dellarray x. x pu essere unespressione logica. Esempio
a = [ 5 6 7 2 10 ]
find(a>5) -> ans = 2 3 5
NB: find restituisce gli indici e non i valori degli array mentre
usando i vettori logici come indici si ottengono i valori
Esempio: (NB: tutti i valori diversi da zero corrispondono a
true)
x = [5, -3, 0, 0, 8];y = [2, 4, 0, 5, 7];
v = y(x&y) -> v = [2 4 7]
ind = find(x&y) -> ind = [1 2 5]
13
Funzioni logiche
Nome della
funzione
Elemento restituito
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
isempty(x)
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
ischar(x)
isnumeric(x)
isreal(x)
- 14 -
Il costrutto if
if espressione1
istruzione 1-1
istruzione 1-2
..........
elseif espressione2
istruzione 2-1
istruzione 2-2
..........
.....
else
istruzione k-1
istruzione k-2
..........
end
Il costrutto switch
Listruzione condizionale switch consente una scrittura
alternativa ad if/elseif/else
Qualunque struttura switch pu essere tradotta in un
if/elseif/else equivalente
switch variabile (scalare o stringa)
case valore1
istruzioni caso 1
case valore2
istruzioni caso 2
...
otherwise
istruzioni per i restanti casi
end
16
Il ciclo while
while espressione
istruzioni da ripetere finch espressione vera
end
espressione deve essere inizializzata (avere un valore) prima
dellinizio del ciclo
Il valore di espressione deve cambiare nelle ripetizioni
Esempio: Calcoliamo gli interessi fino al raddoppio del capitale
value = 1000;
year = 0;
while value < 2000
value = value * 1.08
year = year + 1;
fprintf('%g years: $%g\n', year,value)
end
17
Il ciclo for
for indice = espressione
istruzioni
end
Esempio leggi 7 numeri e mettili in un vettore di nome number:
for n = 1:7
number(n) = input('enter value ');
end
Esempio - conto alla rovescia in secondi
time = input('how long? ');
for count = time:-1:1
pause(1);
fprintf('%g seconds left \n',count);
end
disp('done');
18
Il ciclo for
Il ciclo for usa un array per assegnare valori alla variabile di
conteggio
Questo array pu essere generato al volo con unespressione
del tipo init:delta:fin
Nel primo esempio del lucido precedente larray [1 2 3 4 5 6 7]
19
Esempi
Inizializzazione dellindice del for a partire da una matrice
board = [ 1 1 1 ; 1 1 -1 ; 0 1 0 ];
1
for x = board
1
x
alla prima iterazione x e` il vettore colonna
0
end
Inizializzazione dellindice del for a partire da una stringa
for x = 'EGR106
disp(x) %alla prima iterazione x vale E
end
20
Vettorizzazione (1)
In molti casi possibile sostituire un for con luso di un opportuno
vettore. Esempio
%calcolo del quadrato degli interi tra 1 e 100
for ii=1:100
square(ii)=ii^2;
end
%frammento di codice equivalente: vettorizzazione
ii=1:100;
NB: bisogna usare la versione .^che opera elemento per elemento
square=ii.^2;
21
Vettorizzazione (2)
Riprendiamo lesempio
b = a>5
sqrt(a(b))
a(b)=sqrt(a(b))
Break e Continue
I cicli contengono una serie di istruzioni che vogliamo
ripetere
Per potremmo aver bisogno di:
Saltare alliterazione successiva
Terminare il ciclo
23
Esempio
Acquisiamo numeri da tastiera finch non viene
inserito un numero negativo. In ogni caso non
accettiamo pi di mille numeri:
vector = [ ]; %crea il vettore vuoto
for count = 1:1000 %Raccoglier al max 1000 valori
value = input('next number ');
if value < 0
break %Se value negativo usciamo dal ciclo
else
vector(count) = value;
end
end
vector %permette di visualizzare il contenuto di vector
24
Strutture
26
Size
1x1
Bytes Class
568 struct
Attributes
Esempio
>> rilieviAltimetrici=struct('latitudine',20,'longitudine',30, 'altitudine',
'altitudine', 1300)
rilievoAltimetrico =
latitudine: 20
longitudine: 30
altitudine: 1300
28
Esempio
rilieviAltimetrici(1000)=struct('latitudine',80,'longitudine',[],
'altitudine', 1450)
rilieviAltimetrici =
1x1000 struct array with fields:
latitudine
longitudine
altitudine
29
Aggiunta di campi
Aggiunta di un campo: facciamo riferimento alla
definizione di studente delle slide precedenti
studente(2).esami = [20 25 30];
30
a = [25 30]
31
32
Esercizio
Si sviluppi un programma in matlab che acquisisce
da tastiera i dati relativi a rilievi altimetrici e stampa a
video laltitudine media di tutti quelli che hanno
latitudine compresa tra 10 e 80 e longitudine tra 30 e
60
33
Soluzione (1)
more = input('vuoi inserire valori altimetrici? (s/n)');
ii=1;
while more=='s'
arch(ii).altitudine = input('altitudine ');
arch(ii).longitudine = input('longitudine ');
arch(ii).latitudine = input('latitudine ');
ii = ii+1;
more = input('vuoi inserire altri valori altimetrici? (s/n)');
end
34
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))]);
35