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
logicalpari a1; - Se invocata con un parametro
true(n), restituisce una matrice quadratadi valori logicalpari a1; - Se invocata con due parametri
true(m, n), restituisce una matricedi valori logicalpari 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
logicalpari a0; - Se invocata con un parametro
true(n), restituisce una matrice quadratadi valori logicalpari a0; - Se invocata con due parametri
true(m, n), restituisce una matricedi valori logicalpari 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.