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.

Concetti Chiave
  • 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 3 \times 3 ed è composta da 9 elementi interi casuali compresi tra -10 e 10. Per trovare, ad esempio, gli elementi maggiori di zero basta introdurre la seguente espressione:

>> 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 3 \times 3 double ed occupa 72 byte (ossia 8 \times 9 byte), mentre il risultato è una matrice di 3 \times 3 logical e occupa 9 byte.

Definizione

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 3 \times 3 di elementi 0 basta invocare la funzione false:

>> false(3, 3)

ans =

  3×3 logical array

   0   0   0
   0   0   0
   0   0   0
Definizione

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 a 1;
  • Se invocata con un parametro true(n), restituisce una matrice quadrata n \times n di valori logical pari a 1;
  • Se invocata con due parametri true(m, n), restituisce una matrice m \times n di valori logical pari a 1;
Definizione

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 a 0;
  • Se invocata con un parametro true(n), restituisce una matrice quadrata n \times n di valori logical pari a 0;
  • Se invocata con due parametri true(m, n), restituisce una matrice m \times n di valori logical pari a 0;

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 -10 e 10. Vogliamo trovare quanti valori maggiori di zero sono presenti nel vettore.

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.

Definizione

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
Nota

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.