Indicizzazione di array
In MATLAB® sono disponibili tre approcci principali per accedere agli elementi di un array in base alla loro posizione (indice) nell'array. Questi approcci sono l'indicizzazione per posizione, l'indicizzazione lineare e l'indicizzazione logica. È inoltre possibile utilizzare un'indicizzazione mista, combinando sia l'indicizzazione per posizione che quella logica.
Indicizzazione con le posizioni degli elementi
L'approccio più comune è quello di specificare gli indici degli elementi in modo esplicito. Ad esempio, per accedere a un singolo elemento di una matrice, specificare il numero di riga seguito dal numero di colonna dell'elemento.
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
A = 4×4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
e = A(3,2)
e = 10
e è l'elemento nella posizione 3,2 (terza riga, seconda colonna) di A.
È inoltre possibile fare riferimento a più elementi alla volta, specificando i loro indici in un vettore. Ad esempio, accedere al primo e al terzo elemento della seconda riga di A.
r = A(2,[1 3])
r = 1×2
5 7
Per accedere agli elementi di un intervallo di righe o di colonne, utilizzare l'operatore colon. Ad esempio, accedere agli elementi delle righe dalla prima alla terza e delle colonne dalla seconda alla quarta di A.
r = A(1:3,2:4)
r = 3×3
2 3 4
6 7 8
10 11 12
Un modo alternativo per accedere a quegli elementi è utilizzare la parola chiave end per rappresentare l'ultima colonna. Questo approccio consente di specificare l'ultima colonna senza sapere esattamente quante colonne sono presenti in A.
r = A(1:3,2:end)
r = 3×3
2 3 4
6 7 8
10 11 12
Se si desidera accedere a tutte le righe o le colonne, utilizzare l'operatore dei due punti da solo. Ad esempio, restituire tutta la terza riga di A.
r = A(3,:)
r = 1×4
9 10 11 12
È inoltre possibile accedere alla penultima colonna di A utilizzando l'operatore due punti e la parola chiave end.
r = A(:,end-1)
r = 4×1
3
7
11
15
In linea generale, è possibile utilizzare l'indicizzazione per accedere agli elementi di un array in MATLAB, indipendentemente dal tipo di dati o dalle dimensioni. Ad esempio, accedere direttamente a una colonna di un array datetime.
t = [datetime(2018,1:5,1); datetime(2019,1:5,1)]
t = 2×5 datetime
01-Jan-2018 01-Feb-2018 01-Mar-2018 01-Apr-2018 01-May-2018
01-Jan-2019 01-Feb-2019 01-Mar-2019 01-Apr-2019 01-May-2019
march1 = t(:,3)
march1 = 2×1 datetime
01-Mar-2018
01-Mar-2019
Per array di dimensioni superiori, espandere la sintassi per adattarla alle dimensioni dell'array. Si consideri un array numerico casuale 3x3x3. Accedere all'elemento della seconda riga, della terza colonna e del primo foglio dell'array.
A = rand(3,3,3); e = A(2,3,1)
e = 0.5469
Per maggiori informazioni sul lavoro con gli array multidimensionali, vedere Array multidimensionali.
Indicizzazione con indice singolo
Un altro approccio per accedere agli elementi di un array consiste nell'utilizzare un indice singolo, indipendentemente dalla grandezza o dalle dimensioni dell'array. Questo approccio è noto come indicizzazione lineare. Sebbene MATLAB visualizzi gli array in base alle loro grandezze e forme definite, effettivamente vengono memorizzati nella memoria colonna per colonna, procedendo da sinistra verso destra. Un modo efficace per visualizzare questo concetto è con una matrice. Sebbene il seguente array sia visualizzato come una matrice 3x3, MATLAB lo memorizza come una singola colonna composta dalle colonne di A aggiunte una dopo l'altra. Il vettore memorizzato contiene la sequenza degli elementi 12, 45, 33, 36, 29, 25, 91, 48, 11, che può essere visualizzata utilizzando un due punti singolo.
A = [12 36 91; 45 29 48; 33 25 11]
A = 3×3
12 36 91
45 29 48
33 25 11
Alinear = A(:)
Alinear = 9×1
12
45
33
36
29
25
91
48
11
Ad esempio, l'elemento 3,2 di A è 25 ed è possibile accedervi utilizzando la sintassi A(3,2). È inoltre possibile accedere a questo elemento utilizzando la sintassi A(6), poiché 25 è il sesto elemento della sequenza vettoriale memorizzata.
e = A(3,2)
e = 25
elinear = A(6)
elinear = 25
Sebbene l'indicizzazione lineare possa essere meno intuitiva dal punto di vista visivo, può essere molto efficace per eseguire alcuni calcoli che non dipendono dalla grandezza o dalla forma dell'array. Ad esempio, è possibile sommare facilmente tutti gli elementi di A senza dover fornire un secondo argomento alla funzione sum.
s = sum(A(:))
s = 330
Le funzioni sub2ind e ind2sub aiutano a convertire gli indici originali dell'array nella loro versione lineare. Ad esempio, calcolare l'indice lineare dell'elemento 3,2 di A.
linearidx = sub2ind(size(A),3,2)
linearidx = 6
Riconvertire l'indice lineare nella sua forma a righe e colonne.
[row,col] = ind2sub(size(A),6)
row = 3
col = 2
Indicizzazione con valori logici
L'utilizzo degli indicatori logici true e false è un altro approccio utile per indicizzare gli array, in particolare quando si lavora con le dichiarazioni condizionali. Ad esempio, si supponga di voler sapere se gli elementi di una matrice A sono minori dei corrispondenti elementi di un'altra matrice B. L'operatore minore-di restituisce un array logico i cui elementi sono 1 quando un elemento in A è più piccolo del corrispondente elemento in B.
A = [1 2 6; 4 3 6]
A = 2×3
1 2 6
4 3 6
B = [0 3 7; 3 7 5]
B = 2×3
0 3 7
3 7 5
ind = A < B
ind = 2×3 logical array
0 1 1
0 1 0
Ora che si conosce la posizione degli elementi che soddisfano la condizione, è possibile esaminare i singoli valori utilizzando ind come array di indici. MATLAB abbina le posizioni del valore 1 in ind agli elementi corrispondenti di A e B ed elenca i loro valori in un vettore colonna.
Avals = A(ind)
Avals = 3×1
2
3
6
Bvals = B(ind)
Bvals = 3×1
3
7
7
Le funzioni "is" di MATLAB restituiscono inoltre array logici che indicano quali elementi di input soddisfano una determinata condizione. Ad esempio, verificare quali elementi di un vettore di stringa sono mancanti utilizzando la funzione ismissing.
str = ["A" "B" missing "D" "E" missing]; ind = ismissing(str)
ind = 1×6 logical array
0 0 1 0 0 1
Si supponga di voler trovare i valori degli elementi che non sono mancanti. A tale scopo, utilizzare l'operatore ~ con il vettore indice ind.
strvals = str(~ind)
strvals = 1×4 string
"A" "B" "D" "E"
Per ulteriori esempi sull'utilizzo dell'indicizzazione logica, vedere Identificazione degli elementi dell'array che soddisfano le condizioni.
Indicizzazione mista con valori logici e posizioni degli elementi
È inoltre possibile utilizzare una combinazione di indicizzazione per posizione e logica per accedere agli elementi dell'array.
Ad esempio, creare una matrice 5x5.
A = magic(5)
A = 5×5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
Si supponga di voler selezionare gli elementi di A che si trovano nelle righe con indici primi e nelle colonne con indici 2, 3 e 4.

A tale scopo, creare un vettore B che rappresenti gli indici delle righe in A.
B = (1:size(A,1))
B = 1×5
1 2 3 4 5
Utilizzare la funzione isprime per determinare quali elementi in B sono primi. Il risultato è un array logico che si può utilizzare per indicizzare le righe di A.
rows = isprime(B)
rows = 1×5 logical array
0 1 1 0 1
Quindi, definire le colonne che si desidera selezionare, situate nelle posizioni da 2 a 4.
cols = 2:4
cols = 1×3
2 3 4
Utilizzare l'indicizzazione logica per selezionare le righe di A situate nelle posizioni dei numeri primi, come definito da rows. Quindi, utilizzare l'indicizzazione per posizione per selezionare le colonne di A che vanno dalla posizione 2 alla 4, come definito da cols.
A(rows,cols)
ans = 3×3
5 7 14
6 13 20
18 25 2
Vedi anche
Argomenti
- Access Data Using Categorical Arrays
- Access Data in Tables
- Structure Arrays
- Access Data in Cell Array
- Indexed Assignment
- Detailed Rules for Array Indexing