Identificazione degli elementi dell'array che soddisfano le condizioni
Questo esempio mostra come filtrare gli elementi di un array applicando delle condizioni all'array. Ad esempio, è possibile esaminare gli elementi pari in una matrice, identificare la posizione di tutti gli 0 in un array multidimensionale o sostituire i valori NaN nei dati. È possibile eseguire queste attività utilizzando una combinazione di operatori relazionali e logici. Gli operatori relazionali (>, <, >=, <=, ==, ~=) impongono delle condizioni sull'array ed è possibile applicare più condizioni collegandole con gli operatori logici and, or e not, indicati rispettivamente dai simboli &, | e ~.
Applicazione di una singola condizione
Per applicare una singola condizione, iniziare creando una matrice 5x5 contenente numeri interi casuali compresi tra 1 e 15. Reimpostare il generatore di numeri casuali allo stato predefinito per garantire la riproducibilità.
rng("default")
A = randi(15,5)A = 5×5
13 2 3 3 10
14 5 15 7 1
2 9 15 14 13
14 15 8 12 15
10 15 13 15 11
Utilizzare l'operatore relazionale minore di < per determinare quali elementi di A sono minori di 9. Memorizzare il risultato in B.
B = A < 9
B = 5×5 logical array
0 1 1 1 0
0 1 0 1 1
1 0 0 0 0
0 0 1 0 0
0 0 0 0 0
Il risultato è una matrice logica. Ogni valore in B è un 1 logico (true) o uno 0 logico (false) che indica se il corrispondente elemento di A soddisfa la condizione A < 9. Ad esempio, A(1,1) è pari a 13, quindi B(1,1) è 0 logico (false). Tuttavia, A(1,2) è pari a 2, quindi B(1,2) è 1 logico (true).
Sebbene B contenga informazioni su quali elementi di A sono minori di 9, B non indica i loro valori. Anziché confrontare le due matrici elemento per elemento, è possibile utilizzare B per indicizzare ad A.
A(B)
ans = 8×1
2
2
5
3
8
3
7
1
Il risultato è un vettore colonna degli elementi in A che sono minori di 9. Dato che B è una matrice logica, questa operazione è chiamata indicizzazione logica. In questo caso, l'array logico utilizzato come indice ha la stessa dimensione dell'array che sta indicizzando, sebbene questo non sia un requisito. Per maggiori informazioni, vedere Indicizzazione di array.
Alcuni problemi richiedono informazioni sulle posizioni degli elementi dell'array che soddisfano una condizione piuttosto che sui loro valori effettivi. In questo esempio, è possibile utilizzare la funzione find per localizzare tutti gli elementi in A minori di 9.
I = find(A < 9)
I = 8×1
3
6
7
11
14
16
17
22
Il risultato è un vettore colonna di indici lineari. Ciascun indice descrive la posizione di un elemento in A che è minore di 9, quindi in pratica A(I) restituisce lo stesso risultato di A(B). La differenza è che A(B) utilizza l'indicizzazione logica, mentre A(I) utilizza l'indicizzazione lineare.
Applicazione di più condizioni
È possibile utilizzare gli operatori logici and, or e not per applicare un numero qualsiasi di condizioni a un array; il numero di condizioni non è limitato a uno o due.
In primo luogo, utilizzare l'operatore logico and, indicato con & per specificare due condizioni: gli elementi devono essere minori di 9 e maggiori di 2. Specificare le condizioni come indice logico per visualizzare gli elementi che soddisfano entrambe le condizioni.
A(A<9 & A>2)
ans = 5×1
5
3
8
3
7
Il risultato è un elenco degli elementi in A che soddisfano entrambe le condizioni. Assicurarsi di specificare ogni condizione con una dichiarazione separata collegata da un operatore logico. Ad esempio, non è possibile specificare le condizioni sopra riportate utilizzando A(2<A<9) perché viene valutato come A(2<A | A<9).
Successivamente, identificare gli elementi in A che sono minori di 9 e pari.
A(A<9 & ~mod(A,2))
ans = 3×1
2
2
8
Il risultato è un elenco di tutti gli elementi pari in A che sono minori di 9. L'utilizzo dell'operatore logico not, ~, converte la matrice mod(A,2) in una matrice logica, con un valore di 1 logico (true) posizionato dove un elemento è divisibile per 2 o è pari.
Infine, identificare gli elementi in A che sono minori di 9 e pari, nonché diversi da 2.
A(A<9 & ~mod(A,2) & A~=2)
ans = 8
Il risultato, 8, è minore di 9, è pari ed è diverso da 2. È l'unico elemento in A che soddisfa tutte e tre le condizioni.
Utilizzare la funzione find per ottenere l'indice dell'elemento uguale a 8 che soddisfa le condizioni.
find(A<9 & ~mod(A,2) & A~=2)
ans = 14
Il risultato indica che A(14) = 8.
Sostituzione dei valori che soddisfano la condizione
A volte è utile modificare contemporaneamente i valori di più elementi di un array esistente. Utilizzare l'indicizzazione logica con una semplice dichiarazione di assegnazione per sostituire i valori in un array che soddisfano una condizione.
Ad esempio, sostituire tutti i valori in A che sono maggiori di 10 con il numero 10.
A(A>10) = 10
A = 5×5
10 2 3 3 10
10 5 10 7 1
2 9 10 10 10
10 10 8 10 10
10 10 10 10 10
Successivamente, sostituire tutti i valori in A che sono diversi da 10 con un valore NaN.
A(A~=10) = NaN
A = 5×5
10 NaN NaN NaN 10
10 NaN 10 NaN NaN
NaN NaN 10 10 10
10 10 NaN 10 10
10 10 10 10 10
Infine, sostituire tutti i valori NaN in A con zeri e applicare l'operatore logico not su A, ~A.
A(isnan(A)) = 0; C = ~A
C = 5×5 logical array
0 1 1 1 0
0 1 0 1 1
1 1 0 0 0
0 0 1 0 0
0 0 0 0 0
La matrice risultante presenta valori di 1 logici (true) al posto dei valori NaN e 0 logici (false) al posto dei valori 10. L'operazione logica not, ~A, converte l'array numerico A in un array logico C in modo tale che A&C restituisca una matrice di valori 0 logici (false) e A|C restituisca una matrice di valori 1 logici (true).
Vedi anche
nan | Short-Circuit
AND | Short-Circuit
OR | isnan | find | and | or | xor | not