Accesso ai dati nell'array di celle
Indicizzazione di base
Un array di celle è un tipo di dato con contenitori di dati indicizzati chiamati celle. Ciascuna cella può contenere qualsiasi tipo di dato. Gli array di celle sono spesso utilizzati per contenere dati provenienti da un file con formattazione incoerente, quali colonne che contengono sia dati numerici che testuali.
Ad esempio, si consideri un array di celle 2×3 con dati misti.
C = {'one','two','three';
100,200,rand(3,3)}C=2×3 cell array
{'one'} {'two'} {'three' }
{[100]} {[200]} {3×3 double}
Ogni elemento si trova all'interno di una cella. Se si indicizza a questo array utilizzando le parentesi standard, il risultato è un sottoinsieme dell'array di celle che include le celle.
C2 = C(1:2,1:2)
C2=2×2 cell array
{'one'} {'two'}
{[100]} {[200]}
Per leggere o scrivere il contenuto all'interno di una cella specifica, racchiudere gli indici tra parentesi graffe.
R = C{2,3}R = 3×3
0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575
C{1,3} = 'longer text in a third location'C=2×3 cell array
{'one'} {'two'} {'longer text in a third location'}
{[100]} {[200]} {3×3 double }
Per sostituire contemporaneamente il contenuto di più celle, utilizzare le parentesi per fare riferimento alle celle e le parentesi graffe per definire un array di celle di dimensioni equivalenti.
C(1,1:2) = {'first','second'}C=2×3 cell array
{'first'} {'second'} {'longer text in a third location'}
{[ 100]} {[ 200]} {3×3 double }
Lettura dei dati da più celle
La maggior parte delle funzioni di elaborazione dei dati in MATLAB® operano su un array rettangolare con un tipo di dato uniforme. Poiché gli array di celle possono contenere una combinazione di tipi e dimensioni, è talvolta necessario estrarre e combinare i dati dalle celle prima di elaborarli. Questa sezione descrive alcuni scenari comuni.
Testo in celle specifiche
Quando l'intero array di celle o un sottoinsieme noto di celle contiene testo, è possibile indicizzare e passare le celle direttamente a una qualsiasi delle funzioni di elaborazione del testo in MATLAB. Ad esempio, individuare dove compare la lettera t in ciascun elemento della prima riga di C.
ts = strfind(C(1,:),'t')ts=1×3 cell array
{[5]} {0×0 double} {[8 11 18 28]}
Numeri in celle specifiche
I due modi principali per elaborare i dati numerici in un array di celle sono:
Combinare il contenuto di quelle celle in un unico array numerico, quindi elaborare tale array.
Elaborare separatamente le singole celle.
Per combinare celle numeriche, utilizzare la funzione cell2mat. Per la concatenazione, è necessario che gli array in ciascuna cella abbiano dimensioni compatibili. Ad esempio, i primi due elementi della seconda riga di C sono valori scalari. Combinali in un vettore numerico 1x2.
v = cell2mat(C(2,1:2))
v = 1×2
100 200
Per elaborare singole celle, è possibile utilizzare la funzione cellfun. Quando si chiama cellfun, specificare la funzione da applicare a ciascuna cella. Utilizzare il simbolo @ per indicare che si tratta di una funzione e per creare un handle della funzione. Ad esempio, trovare la lunghezza di ciascuna delle celle nella seconda riga di C.
len = cellfun(@length,C(2,:))
len = 1×3
1 1 3
Dati in celle con indici non noti
Quando alcune celle contengono dati che si desidera elaborare, ma non si conoscono gli indici esatti, è possibile utilizzare una delle seguenti opzioni:
Trovare tutti gli elementi che soddisfano una determinata condizione utilizzando l'indicizzazione logica, quindi elaborarli.
Controllare ed elaborare le celle una alla volta con un
forloop o unwhileloop.
Ad esempio, si supponga di voler elaborare solo le celle che contengono vettori di caratteri. Per sfruttare l'indicizzazione logica, utilizzare innanzitutto la funzione cellfun con ischar per individuare tali celle.
idx = cellfun(@ischar,C)
idx = 2×3 logical array
1 1 1
0 0 0
Quindi, utilizzare l'array logico per indicizzare all'array di celle C(idx). Il risultato dell'operazione di indicizzazione è un vettore colonna che è possibile passare a una funzione di elaborazione del testo, come strlength.
len = strlength(C(idx))
len = 3×1
5
6
31
L'altro approccio consiste nell'utilizzare un loop per controllare ed elaborare il contenuto di ciascuna cella. Ad esempio, individuare le celle che contengono la lettera t e combinarle in un array di stringhe eseguendo un loop sulle celle. Tenere traccia di quanti elementi vengono aggiunti all'array di stringhe dal loop nella variabile n.
n = 0; for k = 1:numel(C) if ischar(C{k}) && contains(C{k},"t") n = n + 1; txt(n) = string(C{k}); end end txt
txt = 1×2 string
"first" "longer text in a third location"
Indicizzazione a più celle
Se si fa riferimento a più celle utilizzando l'indicizzazione con parentesi graffe, MATLAB restituisce il contenuto delle celle come un elenco separato da virgole. Ad esempio,
C{1:2,1:2}
equivale a
C{1,1}, C{2,1}, C{1,2}, C{2,2}.
Poiché ciascuna cella può contenere un tipo di dato diverso, non è possibile assegnare questo elenco a una singola variabile. Tuttavia, è possibile assegnare l’elenco a un numero di variabili pari al numero di celle.
[v1,v2,v3,v4] = C{1:2,1:2}v1 = 'first'
v2 = 100
v3 = 'second'
v4 = 200
Se ciascuna cella contiene lo stesso tipo di dato con dimensioni compatibili, è possibile creare una singola variabile applicando l'operatore di concatenazione dell'array [] all'elenco separato da virgole.
v = [C{2,1:2}]v = 1×2
100 200
Se il contenuto delle celle non può essere concatenato, memorizzare i risultati in un nuovo array di celle, tabella o altro contenitore eterogeneo. Ad esempio, convertire i dati numerici nella seconda riga di C in una tabella. Utilizzare i dati di testo nella prima riga di C per i nomi delle variabili.
t = cell2table(C(2,:),VariableNames=C(1,:))
t=1×3 table
first second longer text in a third location
_____ ______ _______________________________
100 200 {3×3 double}
Indicizzazione agli array all'interno di celle
Se una cella contiene un array, è possibile accedere a elementi specifici all'interno di tale array utilizzando due livelli di indicizzazione. In primo luogo, utilizzare le parentesi graffe per accedere al contenuto della cella. Quindi, utilizzare la sintassi di indicizzazione standard per il tipo di array in quella cella.
Ad esempio, C{2,3} restituisce una matrice 3x3 di numeri casuali. Indicizzare con le parentesi per estrarre la seconda riga di quella matrice.
C{2,3}(2,:)ans = 1×3
0.9058 0.6324 0.5469
Se la cella contiene un array di celle, utilizzare le parentesi graffe per l'indicizzazione, mentre se contiene un array di strutture, utilizzare la notazione a punto per fare riferimento a campi specifici. Ad esempio, si consideri un array di celle che contiene un array di celle 2x1 e una struttura scalare con campi f1 e f2.
c = {'A'; ones(3,4)};
s = struct("f1",'B',"f2",ones(5,6));
C = {c,s}C=1×2 cell array
{2×1 cell} {1×1 struct}
Estrarre gli array di uno dall'array di celle annidato e dalla struttura.
A1 = C{1}{2}A1 = 3×4
1 1 1 1
1 1 1 1
1 1 1 1
A2 = C{2}.f2A2 = 5×6
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
È possibile annidare un numero qualsiasi di array di celle e di strutture. Applicare le stesse regole di indicizzazione ai livelli inferiori della gerarchia. Ad esempio, queste sintassi sono valide quando le celle referenziate contengono l'array di celle o di strutture previsto.
C{1}{2}{3}
C{4}.f1.f2(1)
C{5}.f3.f4{1}
A qualsiasi livello di indicizzazione, se si fa riferimento a più celle, MATLAB restituisce un elenco separato da virgole. Per maggiori informazioni, vedere Index into Multiple Cells (Indicizzazione a più celle).