Tipi di array
Array multidimensionali
Gli array multidimensionali nell'ambiente di MATLAB® sono array con oltre due pedici. Uno dei metodi per creare un array multidimensionale consiste nel richiamare zeros
, ones
, rand
o randn
con più di due argomenti. Ad esempio,
R = randn(3,4,5);
crea un array 3x4x5 con un totale di 3*4*5 = 60
elementi casuali distribuiti normalmente.
Un array tridimensionale può rappresentare dati fisici tridimensionali, come la temperatura di un ambiente campionata su una griglia rettangolare. Può anche rappresentare una sequenza di matrici, A(k) o campioni di una matrice dipendente dal tempo, A(t). In questi ultimi casi, l'elemento (i, j)-esimo della matrice k-esima, o la matrice tk-esima, sono denotati con A(i,j,k)
.
Le versioni di MATLAB e quelle di Dürer del quadrato magico di ordine 4 differiscono per lo scambio di due colonne. Scambiando tra loro le colonne è possibile generare numerosi quadrati magici diversi. La dichiarazione
p = perms(1:4);
genera le permutazioni 4! = 24 di 1:4
. La k
-esima permutazione è il vettore riga p(k,:)
. Quindi
A = magic(4); M = zeros(4,4,24); for k = 1:24 M(:,:,k) = A(:,p(k,:)); end
memorizza la sequenza di 24 quadrati magici nell'array tridimensionale M
. Le dimensioni di M
sono
size(M) ans = 4 4 24
Nota
L'ordine delle matrici riportato in questa illustrazione potrebbe differire dai propri risultati ottenuti. La funzione perms
restituisce sempre tutte le permutazioni del vettore di input, ma l'ordine di tali permutazioni potrebbe differire utilizzando versioni diverse di MATLAB.
La dichiarazione
sum(M,d)
calcola le somme variando il d
-esimo pedice. Quindi
sum(M,1)
è un array 1x4x24 che contiene 24 copie del vettore riga
34 34 34 34
e
sum(M,2)
è un array 4x1x24 che contiene 24 copie del vettore colonna
34 34 34 34
Infine,
S = sum(M,3)
aggiunge alla sequenza le 24 matrici. Il risultato presenta dimensioni 4x4x1 e il suo aspetto richiama un array 4x4:
S = 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204
Array di celle
Gli array di celle in MATLAB sono array multidimensionali i cui elementi sono copie di altri array. È possibile creare un array di celle con matrici vuote tramite la funzione cell
. Più di frequente, tuttavia, gli array di celle vengono creati racchiudendo un gruppo diversificato di elementi tra parentesi graffe, {}
. Le parentesi graffe sono utilizzate anche con i pedici per accedere al contenuto di varie celle. Ad esempio,
C = {A sum(A) prod(prod(A))}
produce un array di celle 1x3. Le tre celle contengono il quadrato magico, il vettore riga della somma delle colonne e il prodotto di tutti i suoi elementi. Quando si visualizza C
, si vede
C = [4x4 double] [1x4 double] [20922789888000]
Questo accade perché le prime due celle sono troppo larghe per essere stampate in uno spazio così limitato, mentre la terza cella contiene un solo numero, 16!, quindi vi è spazio sufficiente per la stampa.
Sono due i punti importanti da ricordare. Per prima cosa, per richiamare il contenuto di una delle celle si utilizzano i pedici tra parentesi graffe. Ad esempio, C{1}
richiama il quadrato magico e C{3}
è 16!. In secondo luogo, gli array di celle contengono copie di altri array, non puntatori verso tali array. Se in un secondo momento si modifica A
, l'operazione non ha effetto su C
.
È possibile utilizzare array tridimensionali per memorizzare una sequenza di matrici delle medesime dimensioni. È possibile utilizzare array di celle per memorizzare una sequenza di matrici di dimensioni diverse. Ad esempio,
M = cell(8,1); for n = 1:8 M{n} = magic(n); end M
produce una sequenza di quadrati magici di ordine diverso:
M = [ 1] [ 2x2 double] [ 3x3 double] [ 4x4 double] [ 5x5 double] [ 6x6 double] [ 7x7 double] [ 8x8 double]
È possibile richiamare la matrice del quadrato magico 4x4 con
M{4}
Stringhe di caratteri e testo
Per immettere del testo in MATLAB utilizzare gli apici. Ad esempio,
s = 'Hello'
Il risultato non è lo stesso tipo di matrice numerica o array visti finora. Si tratta di un array di caratteri 1x5.
Internamente i caratteri vengono memorizzati come numeri, ma non in formato a punto mobile. La dichiarazione
a = double(s)
converte l'array di caratteri in matrice numerica contenente rappresentazioni a punto mobile dei codici ASCII per ciascun carattere. Il risultato è
a = 72 101 108 108 111
La dichiarazione
s = char(a)
inverte la conversione.
La conversione da numeri a caratteri consente di esaminare i vari font disponibili nel proprio computer. I caratteri stampabili nel set di caratteri ASCII di base sono rappresentati dai numeri interi 32:127
. I numeri interi inferiori a 32 rappresentano i caratteri di controllo non stampabili. Questi numeri interi sono disposti in array 6x16 appropriati con
F = reshape(32:127,16,6)';
I caratteri stampabili nel set di caratteri ASCII estesi sono rappresentati da F+128
. Quando questi numeri interi vengono interpretati come caratteri, il risultato dipende dal font in uso. Digitare le dichiarazioni
char(F) char(F+128)
e cambiare il font utilizzato per la finestra Comando. Per cambiare il font, dalla scheda Home nella sezione Environment fare clic su Preferences > Fonts. Se le righe di codice includono dei tabulatori, utilizzare un font a larghezza fissa, come Monospaced
, per allineare le posizioni dei tabulatori su righe diverse.
La concatenazione con parentesi quadre riunisce le variabili di testo. La dichiarazione
h = [s, ' world']
riunisce orizzontalmente i caratteri e produce
h = Hello world
La dichiarazione
v = [s; 'world']
riunisce verticalmente i caratteri e produce
v = Hello world
Si noti che in h
occorre inserire uno spazio vuoto prima di 'w'
e che la lunghezza delle due parole in v
deve essere uguale. Gli array risultanti sono entrambi array di caratteri; h
è 1x11, mentre v
è 2x5.
Per manipolare un corpo di testo contenente righe di lunghezze diverse si hanno due scelte: un array di caratteri di riempimento o un array di celle di vettori di caratteri. Quando si crea un array di caratteri, è necessario che tutte le righe dell'array siano della medesima lunghezza. La parte finale delle righe più corte viene riempita con spazi. La funzione char
effettua automaticamente il riempimento con caratteri. Ad esempio,
S = char('A','rolling','stone','gathers','momentum.')
produce un array di caratteri 5x9:
S = A rolling stone gathers momentum.
È anche possibile memorizzare il testo in un array di celle. Ad esempio,
C = {'A';'rolling';'stone';'gathers';'momentum.'}
crea un array di celle 5x1 che non richiede caratteri di riempimento perché ciascuna riga dell'array può presentare una lunghezza diversa:
C = 'A' 'rolling' 'stone' 'gathers' 'momentum.'
È possibile convertire un array con caratteri di riempimento in un array di celle di vettori di caratteri utilizzando
C = cellstr(S)
e invertire il processo utilizzando
S = char(C)
Strutture
Le strutture sono array multidimensionali di MATLAB con elementi a cui accedono designatori di campo testuali. Ad esempio,
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+'
crea una struttura scalare con tre campi:
S = name: 'Ed Plum' score: 83 grade: 'B+'
Come ogni altro elemento nell'ambiente MATLAB, le strutture sono array ed è quindi possibile inserirvi ulteriori elementi. In questo caso ciascun elemento dell'array è una struttura con numerosi campi. È possibile aggiungere un campo per volta
S(2).name = 'Toni Miller'; S(2).score = 91; S(2).grade = 'A-';
oppure aggiungere un intero elemento con un'unica dichiarazione:
S(3) = struct('name','Jerry Garcia',... 'score',70,'grade','C')
Ora la struttura è sufficientemente grande da consentire solo la stampa di un riepilogo:
S = 1x3 struct array with fields: name score grade
Vi sono numerosi metodi per riassemblare i diversi campi in altri array di MATLAB. Per la maggior parte si basano sulla notazione di un elenco di elementi separati da virgole. Digitando
S.score
equivale a digitare
S(1).score, S(2).score, S(3).score
che è un elenco di elementi separati da virgole.
Racchiudendo tra parentesi quadre l'espressione che genera questo elenco, MATLAB memorizza ciascuna voce dell'elenco in un array. In questo esempio, MATLAB crea un vettore di righe numerico contenente il campo score
di ciascun elemento dell'array della struttura S
:
scores = [S.score] scores = 83 91 70 avg_score = sum(scores)/length(scores) avg_score = 81.3333
Per creare un array di caratteri da uno dei campi di testo, ad esempio name
, richiamare la funzione char
nell'elenco di elementi separati da virgole generato da S.name
:
names = char(S.name) names = Ed Plum Toni Miller Jerry Garcia
Allo stesso modo è possibile creare un array di celle dai campi name
racchiudendo tra parentesi graffe l'espressione che genera l'elenco:
names = {S.name} names = 'Ed Plum' 'Toni Miller' 'Jerry Garcia'
Per assegnare i campi di ciascun elemento di un array della struttura a variabili distinte, esterne alla struttura, specificare ciascun output alla sinistra del segno di uguale, racchiudendo il tutto tra parentesi quadre:
[N1 N2 N3] = S.name N1 = Ed Plum N2 = Toni Miller N3 = Jerry Garcia
Nomi dei campi dinamici
Il metodo più diffuso per accedere ai dati della struttura consiste nello specificare il nome del campo a cui si vuole fare riferimento. Un altro metodo per accede ai dati della struttura consiste nell'utilizzare nomi dei campi dinamici. Questi nomi esprimono il campo come espressione variabile che MATLAB valuta nel corso dell'esecuzione. La sintassi punto-parentesi qui illustrata rende expression
un nome del campo dinamico:
structName.(expression)
Per indicizzare questo campo utilizzare la sintassi di indicizzazione standard di MATLAB. Ad esempio, per valutare expression
in un nome campo e ottenere i valori di questo campo nelle colonne da 1
a 25
della riga 7
, utilizzare
structName.(expression)(7,1:25)
Esempi di nomi dei campi dinamici. La funzione avgscore
sotto illustrata calcola un punteggio di test medio, richiamando le informazioni dalla struttura testscores
utilizzando nomi dei campi dinamici:
function avg = avgscore(testscores, student, first, last) for k = first:last scores(k) = testscores.(student).week(k); end avg = sum(scores)/(last - first + 1);
È possibile eseguire questa funzione utilizzando valori diversi per il campo dinamico student
. Per prima cosa inizializzare la struttura che contiene i punteggi per un periodo di 25 settimane:
testscores.Ann_Lane.week(1:25) = ... [95 89 76 82 79 92 94 92 89 81 75 93 ... 85 84 83 86 85 90 82 82 84 79 96 88 98]; testscores.William_King.week(1:25) = ... [87 80 91 84 99 87 93 87 97 87 82 89 ... 86 82 90 98 75 79 92 84 90 93 84 78 81];
Eseguire ora avgscore
, fornendo i campi dei nomi degli studenti per la struttura testscores
al momento dell'esecuzione utilizzando nomi dinamici dei campi:
avgscore(testscores, 'Ann_Lane', 7, 22) ans = 85.2500 avgscore(testscores, 'William_King', 7, 22) ans = 87.7500