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.
Indicizzazione con le posizioni degli elementi
Il modo 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 il colon
. Ad esempio, accedere agli elementi dalla prima alla terza riga e dalla seconda alla quarta colonna di A
.
r = A(1:3,2:4)
r = 3×3
2 3 4
6 7 8
10 11 12
Un modo alternativo per calcolare r
è quello di utilizzare la parola chiave end
per specificare dalla seconda colonna fino all'ultima. 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 colonna di A
.
r = A(:,3)
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 = 2x5 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 = 2x1 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 Multidimensional Arrays.
Indicizzazione con un indice singolo
Un altro metodo per accedere agli elementi di un array è quello di utilizzare un solo indice, indipendentemente dalla grandezza o dalle dimensioni dell'array. Questo metodo è noto come indicizzazione lineare. Sebbene MATLAB visualizzi gli array in base alle loro grandezze e forme definite, in realtà vengono archiviati nella memoria come una singola colonna di elementi. 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 modo 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 = 2x3 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 string, " "
sono mancanti utilizzando la funzione ismissing
.
str = ["A" "B" missing "D" "E" missing]; ind = ismissing(str)
ind = 1x6 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 = 1x4 string
"A" "B" "D" "E"
Per ulteriori esempi sull'utilizzo dell'indicizzazione logica, vedere Find Array Elements That Meet Conditions.