Vettori Logici in MATLAB
In MATLAB, un vettore logico è un vettore composto da elementi di tipo logical
. Analogamente una matrice logica è una matrice composta da elementi logical
.
I Vettori logici possono essere utilizzati per indicizzare, cioè selezionare, tutti quegli elementi di un vettore che soddisfano una o più condizione. Possono essere utilizzati in espressioni matematiche per ottenere informazioni cumulative su un vettore di partenza.
In questa lezione vediamo come creare e usare i vettori logici con efficacia.
- Si possono ottenere vettori logici come risultato di espressioni logiche che coinvolgono vettori numerici;
- Stesso discorso vale per le matrici;
- Le funzioni cumulative possono essere applicate a vettori logici e a matrici logiche;
- Si possono usare vettori e matrici logiche per l'indicizzazione logica, ossia per ottenere elementi di un vettore o di una matrice che rispettano una certa condizione.
Espressioni Logiche e Vettori Logici
In MATLAB è possibile usare gli operatori relazionali su vettori e matrici.
Ad esempio, supponiamo di avere il seguente vettore:
>> v = [8 2 3 9 4 5]
v =
8 2 3 9 4 5
Il vettore v
è composto da 6 elementi. Vogliamo trovare quali elementi del vettore sono maggiori di 4. Per farlo basta semplicemente introdurre nel prompt la seguente espressione:
>> v > 4
ans =
1×6 logical array
1 0 0 1 0 1
Come si può osservare, il risultato è un vettore delle stesse dimensioni di v
ma contenente valori di tipo logical
. In particolare, in ogni posizione troviamo un 1
o uno 0
a seconda se l'elemento corrispondente nel vettore v
sia maggiore di 4 o meno.
Se invochiamo la funzione whos
otteniamo il seguente risultato:
>> whos
Name Size Bytes Class Attributes
ans 1x6 6 logical
v 1x6 48 double
Possiamo vedere che il vettore è composto da 6 double
e quindi occupa 48 byte, mentre il risultato è composto da 6 logical
e occupa solo 6 byte.
Anche per le matrici vale lo stesso discorso. Possiamo inserire matrici all'interno di espressioni logiche ottenendo una matrice di logical
delle stesse dimensioni.
Prendiamo, ad esempio, la matrice che segue:
>> A = randi([-10, 10], 3, 3)
A =
-8 -4 -1
7 9 -2
4 -10 6
La matrice A
è di dimensione
>> A > 0
ans =
3×3 logical array
0 0 0
1 1 0
1 0 1
Il risultato è un'altra matrice delle stesse dimensioni composta da valori logical
. Come nell'esempio precedente del vettore, anche in questo caso gli elementi del risultato valgono 1
se nella corrispondente posizione c'era un elemento maggiore di zero, mentre valgono 0
in caso contrario.
Invocando la funzione whos
in questo caso otteniamo:
>> whos
Name Size Bytes Class Attributes
A 3x3 72 double
ans 3x3 9 logical
Come si può osservare, la matrice A
è composta da double
ed occupa 72 byte (ossia logical
e occupa 9 byte.
Vettori e Matrici in Espressioni Logiche
In MATLAB, è possibile usare vettori e matrici in espressioni logiche. Il risultato sarà un vettore o una matrice di elementi logical
con gli elementi pari a 1
o 0
a seconda se i corrispondenti elementi del vettore o matrice di partenza soddisfano le condizioni dell'espressione.
Tali matrici o vettori risultanti prendono il nome di Matrici Logiche o Vettori Logici.
Creazione di Vettori Logici
In MATLAB è possibile creare vettori o matrici logiche anche senza usare espressioni logiche.
Per farlo è sufficiente usare true
e false
come funzioni passando il numero di righe e colonne. Ad esempio, volendo creare un vettore riga di 5 elementi 1
basta invocare la funzione true
in questo modo:
>> true(1, 5)
ans =
1×5 logical array
1 1 1 1 1
Invece, per creare una matrice 0
basta invocare la funzione false
:
>> false(3, 3)
ans =
3×3 logical array
0 0 0
0 0 0
0 0 0
Funzione true
In MATLAB true
è una funzione a tutti gli effetti che restituisce uno scalare, un vettore o una matrice composti da tutti valori logical
pari a 1
.
- Se invocata senza parametri restituisce un singolo valore
logical
pari a1
; - Se invocata con un parametro
true(n)
, restituisce una matrice quadratadi valori logical
pari a1
; - Se invocata con due parametri
true(m, n)
, restituisce una matricedi valori logical
pari a1
;
Funzione false
In MATLAB false
è una funzione a tutti gli effetti che restituisce uno scalare, un vettore o una matrice composti da tutti valori logical
pari a 0
.
- Se invocata senza parametri restituisce un singolo valore
logical
pari a0
; - Se invocata con un parametro
true(n)
, restituisce una matrice quadratadi valori logical
pari a0
; - Se invocata con due parametri
true(m, n)
, restituisce una matricedi valori logical
pari a0
;
Funzioni cumulative sui vettori logici
Dato che i valori di tipo logical
valgono 0
o 1
essi possono essere usati in espressioni matematiche. Inoltre è possibile adoperare le funzioni cumulative su vettori e matrici che contengono valori logici.
Ad esempio, supponiamo di avere il seguente vettore:
>> v = randi([-10, 10], 1, 10)
v =
-7 -8 0 10 -3 2 -6 5 -5 0
Il vettore è composto da 10 elementi casuali compresi tra
Il primo passo è quello di ricavare un vettore logico che indichi se un elemento sia maggiore di zero o meno:
>> r = v > 0
r =
1×10 logical array
0 0 0 1 0 1 0 1 0 0
Adesso possiamo usare la funzione sum
per contare gli elementi maggiori di zero presenti:
>> sum(r)
ans =
3
Quindi il numero di elementi maggiori di zero è 3.
Usando le funzioni cumulative su vettori per ottenere informazioni globali sul vettore o sulla matrice di partenza.
Indicizzazione Logica
Un utilizzo molto importante dei vettori logici o delle matrici logiche in MATLAB è quello dell'Indicizzazione Logica.
Normalmente, per accedere agli elementi di un vettore o di una matrice basta specificare gli indici dell'elemento richiesto (o degli elementi) tra parentesi quadre:
>> A = randi([-10, 10], 3, 3)
A =
4 1 -5
8 -8 7
10 -7 -5
>> A(2, 2)
ans =
-8
Se, però, tra le parentesi passiamo un vettore o una matrice di tipo logical
delle stesse dimensioni, MATLAB si comporta in maniera differente. In questo caso il risultato sarà composto dagli elementi della matrice o del vettore che corrispondono ai valori 1
del vettore o matrice indice. Si parla, in questo caso, di Indicizzazione Logica.
Tornando all'esempio, possiamo ottenere una matrice logica indicante gli elementi di A
che sono maggiori di zero:
>> r = A > 0
r =
3×3 logical array
1 1 0
1 0 1
1 0 0
Se usiamo la matrice r
come matrice di indice otteniamo il risultato seguente:
>> A(r)
ans =
4
8
10
1
7
In questo modo abbiamo ottenuto gli elementi che sono maggiori di zero. Da notare che il risultato non è più una matrice ma un vettore degli elementi indicati dal vettore r
.
Indicizzazione Logica
In MATLAB è possibile sfruttare l'indicizzazione logica per accedere agli elementi di un vettore o di una matrice usando vettori o matrici logical
di indice.
Il vincolo è che il vettore o matrice di indice abbia le stesse dimensioni del vettore o matrice a cui accedere.
Nell'usare l'indicizzazione logica bisogna, però, prestare attenzione a non confondere valori logical
con valori double
. Prendiamo l'esempio seguente:
>> v = [1 2 3 4 5]
v =
1 2 3 4 5
>> i = [1 0 0 1 0]
i =
1 0 0 1 0
>> v(i)
Array indices must be positive integers or logical values.
In questo caso, l'errore che abbiamo commesso è stato di usare un vettore di double
per realizzare l'indicizzazione logica invece di usare un vettore di logical
. MATLAB ci segnala, infatti, l'errore.
In tal caso, possiamo convertire il vettore i
in un vettore di logical
semplicemente attraverso la funzione logical
:
>> i = logical(i)
i =
1×5 logical array
1 0 0 1 0
>> v(i)
ans =
1 4
Nell'Indicizzazione logica possono essere usati solo vettori indice o matrici indice di tipo logical
Uno degli errori più comuni è quello di utilizzare vettori o matrici di indici di tipo double
anziché logical
nell'indicizzazione logica.
In Sintesi
In questa lezione abbiamo visto i vettori logici e le matrici logiche. Essi si ottengono dall'impiego nelle espressioni logiche di matrici e vettori numerici. Possono essere usati per indicizzare logicamente altri vettori e altre matrici e su di essi è possibile applicare funzioni cumulative.
Nella prossima lezione studieremo le funzioni logiche che permettono di analizzare velocemente il contenuto di matrici e vettori numerici.