Sei sulla pagina 1di 8

Lab06(logica) Lab06(logica)

Logica e relazioni Operatori Relazionali in MATLAB

 Operatori relaizonali A operatore B


 Vettori logici e indirizzamento  A e B possono essere:
– Variabili, costanti o espressioni da valutare
 Operatori logici – Scalari o Vettori (dimensioni compatibili!)
 Funzioni logiche (find, ecc…) – Numerici o stringhe
 Operatori: > >= ==
< <= ~=

 Il risultato è vero (1) o falso (0) – anche vettore

1 2

Lab06(logica) Lab06(logica)

 Altri esempi
 Note:
espressione risultato
– I vettori logici
5<7 1 possono ancora
[ 3 5 2 ] > = [ 1 0 12 ] 1 1 0 essere usati come
numerici!
max( 1:6 ) < = 7 1
– Possiamo usare il
[3 pi -12 ] > 1 1 1 0 risultato per fare un
'Tom' = = 'Bob' 0 1 0 calcolo: es.
'Tom' = = 'm' 0 0 1 “Quante lettere “s” in
una parola?”

I vettori e le stringhe devono Questi sono


avere le stesse dimensioni! valori logici!!
3 v. Workspace 4
Lab06(logica) Lab06(logica)

STRCMP e vettori di celle STRCMP: esempio

 Per cercare una parola in un vettore di celle


contenente stringhe non possiamo usare
l’operatore == perché non è definito per le
celle.
 Si può usare la funzione strcmp
 Per altre funzioni sulle stringhe digitare:
help strfun

5 6

Lab06(logica) Lab06(logica)

Selezionare elementi di vettori usando i vettori


logici
 Non confondiamo = = e =
Quando utilizziamo un vettore logico come indice per
 La precisione finita può “fregare” il ~ = un array, vengono estratti gli elementi corrispondenti
ai valori 1 del vettore logico.
sind(0) = = 0 1
sind(180) = = 0 0 Quindi se digitiamo A(j), dove j è un vettore logico
della stessa dimensione di A, otteniamo i valori di A
Per i numeri piccoli usiamo eps! corrsipondenti agli indici degli 1 del vettore j.
abs( sind(180) ) < = eps 1
N.B.Per creare un vettore logico NON basta creare un
vettore di 0 e 1 (numeri), bisogna convertirlo con la
funzione logical.

7 8
Lab06(logica) Lab06(logica)

>> A = 1:5
A = Gli operatori relazionali possono essere usati
1 2 3 4 5 direttamente per selezionare gli elementi di un
>> i = [1,0,0,0,1]; vettore.
i =
1 0 0 0 1 Per esempio, se x = [6,3,9] e y = [14,2,9],
>> j=logical(i) digitando
j =
1 0 0 0 1 z = x(x<y)
>> A(j)
ans = Troviamo tutti gli elementi di x che sono minori del
1 5 corrispondente elemento in y.
>> A(i) Il risultato sarà:
??? Index into matrix is negative or zero.
See release notes on change to logical z = 6.
9 indices. 10

Lab06(logica) Lab06(logica)

 Operatori base: and & or |


Operatori logici xor not ~
A B A&B A|B xor(A,B) ~A
A operatore B
0 0 0 0 0 1
 A e B possono essere:
– Logici o Numerici 0 1 0 1 1 1
– Variabili, costanti o espressioni da valutare 1 0 0 1 1 0
– Scalari o Vettori (dimensioni compatibili!)
 A e B, se sono numerici, verranno interpretati come 1 1 1 1 0 0
logici (binari):
– Il numero 0 viene interpretato come falso
– Tutto il resto viene interpretato come vero
“tabella di verità” Operatore
 Il risultato è vero (1) o falso (0) – anche vettore
“unario”
11 12
Lab06(logica) Lab06(logica)

Esempi:  Con i vettori:


Score = [ 70, 55, 88, 98, 80, 73, 90 ]
C = (Score > 70) & (Score < 81)
 “Hai tra 25 e 30 anni?”
C=[0000110]
(eta>=25) & (eta<=30)

 Utile per contare quanti elementi soddisfano


 “siamo in inverno?”
una condizione:
(mese==12 & giorno>=22) | (mese==1) |
B_grades = sum( Score<91 & Score>80 )
(mese==2) | (mese==3 & giorno<=21)

13 14

Lab06(logica) Lab06(logica)

 Esempio con testo:


Precedenza degli operatori (da sinistra a destra)
'Tom'= ='m' | 'Tom'= ='o' 0 1 1
1. Parentesi ( )
name = input('enter name','s'); 2. Trasposta (') and potenza (.^)
name = = 'Tom' | name = = 'Bob' 3. Negativo (-) e negazione logica (~)
4. moltiplicazione (.*) e divisione (./),
5. Addizione (+) sottrazione (-)
 Lancio di un dado: 6. Operatore due punti (:)
roll = sum(ceil(6*rand(1,2))); 7. Operatori relazionali (<, <=, >, >=, = =, ~=)
roll = = 7 | roll = = 11 8. AND logico (&)
9. OR logico (|)

15 16
Lab06(logica) Lab06(logica)

Gli operatori aritmetici +, -, *, /, e \ hanno la precedenza Altri operatori logici:


rispetto agli operatori relazionali. Quindi il comando – Estendere | ed & da op.binari a vettoriali :
any(X) all(X)
z = 5 > 2 + 7 – Per verificare dimensioni, valori e tipi dei vettori:
isempty(A)
è equivalente a
isinf(A) isnan(A)
z = 5 >(2+7) ischar(A) isnumeric(A)
– Per trovare i valori
e dà come risultato z = 0 (logical). per cui è vera una
condizione: find( )
Possiamo usare le parentesi per cambiare l’ordine di
precedenza; per esmpio, z = (5 > 2) + 7 restituisce
z = 8 (numero)
17 18

Lab06(logica) Lab06(logica)

La funzione find e gli operatori logici


La funzione find
Vediamo la sessione:
find(A) Restituisce una matrice
contenenti gli indici degli >>x = [5, -3, 0, 0, 8];y = [2, 4, 0, 5, 7];
elementi non nulli del >>z = find(x&y)
vettore A. z =
1 2 5
[u,v,w] = find(A) Restituisce i vettori u e w
contenteni l’indice di riga Notate che find ritorna gli indici e non i valori degli
e di colonna degli array!!!
elementi non nulli della
matrice A e la matrice w
(opzionale) contenente i
valori degli elementi non (continua …)
19 nulli 20
Lab06(logica) Lab06(logica)

 Altri operatori logici


La funzione find e gli operatori logici

Nella seguente sessione notate la differenza tra il risultato – Estensione di | e & ai vettori:
di y(x&y) e quello di find(x&y) nel lucido precedente. any(X) all(X)
– Per verificare la dimensione:
>>x = [5, -3, 0, 0, 8];y = [2, 4, 0, 5, 7];
>>values = y(x&y) isempty(A)
values = – Per verificare il valore:
2 4 7 isinf(A) isnan(A) finite(A)
– Per verificare il tipo di dati:
ischar(A) isnumeric(A) isreal(A)

21 22

Lab06(logica) Lab06(logica)

Funzione logica Definizione Funzione logica Definizione

all(x) Ritorna uno scalare: 1 se tutti gli elementi del isinf(A) Ritorna un vettore (o matrice) delle
vettore x sono non nulli, 0 altrimenti. stesse dimensioni di A con1 dove gli
all(A) Ritorna un vettore riga, con lo stesso numero elementi di A sono ‘inf’, 0 altrove.
di colonne della matrice A, che contiene 1 o
0, in funzione del fatto che la corrispondente
colonna di A contenga tutti elementi non nulli isnan(A) Ritorna un vettore (o matrice) delle
oppure no. stesse dimensioni di A con1 dove gli
elementi di A sono ‘NaN’, 0 altrove.
any(x) Ritorna uno scalare: 1 se almeno un (‘NaN’ sta per “not a number,” cioè
elemento del vettore x è non nullo, 0 altrimenti.
any(A) Ritorna un vettore riga, con lo stesso numero di risultato indefinito)
colonne della matrice A, che contiene 1 o 0, in
funzione del fatto che la corrispondente finite(A) Ritorna un vettore (o matrice) delle
colonna di A contenga almeno un elemento stesse dimensioni di A, con 1 dove gli
non nullo oppure no. elementi di A sono finiti, 0 altrove.
23 isempty(A) Ritorna 1 se A è vuoto, 0 altirmenti. 24
Lab06(logica) Lab06(logica)

Funzione logica Definizione Appendice:


Vettori di celle (precisazioni)
ischar(A) Ritorna 1 se A è un array
di caratteri, 0 altrimenti.
 Vengono usati di solito per contenere
isnumeric(A) Ritorna 1 se A è un vettore stringhe di diversa lunghezza.
numerico, 0 altrimenti.  Si usano le parentesi graffe per crearli

isreal(A) Ritorna 1 se A ha solo elementi >> nomi={'tim','tom','carl'}


con parte immaginaria nulla, nomi =
0 altrimenti. 'tim' 'tom' 'carl'

25 26

Lab06(logica) Lab06(logica)

Possono anche essere matrici di celle N.B. Quello che otteniamo dall’indicizzazione è
>> nomi={'tim','smith'
'tom','jones' ancora una cella, non una stringa!
'carl','lee'} >> x=nomi(1,2)

x =
nomi =
'smith'
'tim' 'smith'
'tom' 'jones' >> x=='smith'
'carl' 'lee' ??? Error using ==> ==
Function '==' is not defined for values of class 'cell'.

L’indicizzazione è come per le matrici:


>> nomi(1,2) Si converte in stringa con la funzione char!!!
>> char(x)=='smith'
ans =
ans =
L’abbiamo usato anche
'smith' 1 1 1 1 1 nella funzione fprintf!

27 28
Lab06(logica) Lab06(logica)

Per concatenare si usano le parentesi Per trovare un nome in un elenco è molto


quadre, come per i vettori! comoda la strcmp!
>> nomi={'tim','tom','carl'}
>> nomi={'tim','tom','carl'} nomi =
nomi = 'tim' 'tom' 'carl'
'tim' 'tom' 'carl' >> strcmp(nomi,'tom')
>> [nomi,'john'] ans =
??? Error using ==> horzcat
Conversion to cell from char is not possible. 0 1 0
>> [nomi,{'john'}] Dobiamo mettere le graffe >> nomi(ans) Possiamo usare questo
attorno al nuovo nome, Vettore logico per
ans = ans =
per convertirlo in cella! Indirizzare….
'tim' 'tom' 'carl' 'john' 'tom'

29 30

Potrebbero piacerti anche