Tag Archives: giuseppe ciaburro

Concatenare le matrici in Matlab

MATLAB

La Concatenazione è il processo di congiunzione di piccole matrici per creare matrici di dimensioni maggiori. Concatenare le matrici in Matlab è davvero un gioco da ragazzi. Quando si crea una matrice non si fa altro che concatenare i suoi elementi individuali. In Matlab la parentesi quadrata, [ ], rappresenta l’operatore di concatenazione.

Per un esempio, si parta con una matrice 4-by-4 magic square, A:

>> A=magic(4)

A =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

quindi aggiungiamo alla matrice d’origine quattro nuove matrici ognuna delle quali ottenuta partendo dalla matrice A:

>> B = [A A+32; A+48 A+16]

B =

    16     2     3    13    48    34    35    45
     5    11    10     8    37    43    42    40
     9     7     6    12    41    39    38    44
     4    14    15     1    36    46    47    33
    64    50    51    61    32    18    19    29
    53    59    58    56    21    27    26    24
    57    55    54    60    25    23    22    28
    52    62    63    49    20    30    31    17

Il risultato è una matrice 8-by-8 , ottenuta congiungendo le quattro submatrici. Questa matrice ci mostra un altro modo per ottenere una matrice magic square.

concatenazione

I suoi elementi sono un riordinamento dei numeri interi che vanno da 1 a 64, mentre è possibile notare che le somme delle colonne forniscono il valore corretto per una 8-by-8 magic square.

>> sum(B)

ans =

   260   260   260   260   260   260   260   260

Ma la somma delle righe che si ottiene con il comando , sum(B ’) ’, non fornisce lo stesso risultato.

>> sum(B’)’

ans =

   196
   196
   196
   196
   324
   324
   324
   324

In questo articolo abbiamo potuto verificare quanto sia semplice concatenare le matrici in Matlab.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Creare matrici con gli m-file di Matlab

MATLAB

Si possono creare matrici utilizzando gli M-files che sono file di testo contenenti codici MATLAB. Per fare questo basta creare un file che contiene lo stesso statement che si desiderava digitare al prompt di MATLAB, e salvare il file con un nome con estensione .m.

Per scrivere il file di testo basterà un semplice editor di testo tipo notepad che ci permette di realizzare un file di testo formattato in modo semplice senza ulteriori regole di formattazione che nel nostro caso darebbero solo fastidio. Per accedere ad un editor di testo sotto UNIX, usare il simbolo ! seguito dal comando desiderato.

Per esempio, creiamo un file che contiene queste cinque linee:

A = […
16.0 3.0 2.0 13.0
5.0 10.0 11.0 8.0
9.0 6.0 7.0 12.0
4.0 15.0 14.0 1.0];

salviamo il file con il nome matrice.m. Poi al prompt di Matlab digitiamo lo statement matrice, in questo modo avremo detto a Matlab di leggere il file e creare un variabile, A, contenente la nostra matrice d’esempio.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il comando load in Matlab

MATLAB

Il comando load legge file binari che contengono matrici, generati da precedenti sessioni di MATLAB, o legge file di testo contenenti dati numerici. I file di testo dovrebbero essere organizzati come una tabella rettangolare di numeri,separata da spazi vuoti con una riga per linea, e un numero uguale di elementi in ciascuna fila. Per esempio, se al di fuori di MATLAB si crea un file di testo che contiene queste quattro linee:

16.0 3.0 2.0 13.0
5.0 10.0 11.0 8.0
9.0 6.0 7.0 12.0
4.0 15.0 14.0 1.0

salvando poi il file sotto con il nome matrice.dat, basterà digitare al prompt di Matlab il seguente comando:

load matrice.dat

e Matlab leggerà il file e creerà un variabile con il nome matrice, contenente la nostra matrice d’esempio.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Funzioni intrinseche matematiche in Matlab

MATLAB

Le funzioni intrinseche sono delle funzioni inglobate nel workspace di Matlab e già fornite di default nell’ambiente integrato; per poterle utilizzare quindi non sarà necessario installare nulla ne tantomeno reperire la relativa funzione per poi applicarla. Per poter usufruire di tale funzione dovremo solo conoscerne il nome.

Vediamo un esempio di funzione applicata ad un vettore: se si passa quindi  un vettore ad una funzione predefinita per la matematica, verrà restituito un vettore della stessa dimensione, e ogni voce del vettore sarà ottenuta eseguendo l’operazione specificata sulla voce corrispondente del vettore originale: Definiamo un vettore:

>> v = [1 2 3]’

v =

1
2
3

Ed applichiamo ad esso la funzione trigonometrica seno e la funzione logartimo:

>> sin(v)

ans =

0.8415
0.9093
0.1411

>> log(v)

ans =

0
0.6931
1.0986

La capacità di lavorare con queste funzioni vettoriali è uno dei vantaggi di Matlab. In questo modo operazioni complesse possono essere definite ed eseguite velocemente e facilmente. Nel seguente esempio un vettore di grandi dimensioni è definito e può essere facilmente manipolato. Si noti che il secondo comando è un “;” alla fine della riga. Questo dice a Matlab che non deve stampare a video il risultato.

>> x = [0:0.1:100]

x =

Columns 1 through 7

0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000

[stuff deleted]

Columns 995 through 1001

99.4000 99.5000 99.6000 99.7000 99.8000 99.9000 100.0000

>> y = sin(x).*x./(1+cos(x));

Riportiamo un elenco di alcune funzioni matematiche predefinite in MATLAB. Molte di queste funzioni, presentate qui nella loro versione scalare, possono essere applicate anche a variabili matriciali. Indicando con x ed y due numeri reali e z un numero complesso, ricordiamo le seguenti funzioni:

sqrt(x)       \sqrt{x}
round(x)      arrotondamento: x = 3.6 ----> 4
fix(x)        troncamento: x = 3.6 ----> 3
sign(x)       segno di x(vale 1,0 o -1)
sin(x)        sinx
cos(x)        cosx
tan(x)        tanx
sinh(x)       sinh x
cosh(x)       coshx
tanh(x)       tanhx
asin(x)       arcsinx
acos(x)       arccosx
atan(X)       arctanx
exp(x)        e^x
log(x)        log x (logaritmo naturale di x)

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Come modificare le matrici in Matlab

MATLAB

Abbiamo già detto che Matlab è nato proprio dall’esigenza di trattare in modo semplice ed immediato le matrici, ed è quindi questo l’elemento di base che ogni funzione di Matlab avverte l’esigenza di modificare. In questa lezione poniamo l’attenzione su alcune funzioni che consentono di manipolare matrici e vettori.

La funzione abs applicata ad una matrice reale, produce la matrice dei valori assoluti. Applicata ad un numero complesso, ne calcola il modulo. Esempio:

>> A=[-1 -4;-5 6]

A =

    -1    -4
    -5     6

CLICCA PER CONTINUARE A LEGGERE

Generazione di matrici in Matlab

MATLAB

Quando operiamo con le matrici, spesso dobbiamo costruire la matrice su cui effettuare dei calcoli da dati che sono a nostra disposizione, allora si dimostrano particolarmente utili una serie di funzioni buil-in che l’ambiente matlab contiene al suo interno.

Grazie all’utilizzo di tali funzioni sarà possibile costruire tali funzioni in modo semplice e veloce, vediamo allora degli esempi di tali funzioni in ambiente Matlab. Di seguito è riportato un elenco di utili funzioni per la costruzione di matrici:

eye(10)      –  Matrice identità
zeros(10)    – Matrice di zeri
ones(10)     – Matrice di 1
diag(A)       – Matrice diagonale
triu(A)         – Matrice diagonale superiore
tril(A)          – Matrice diagonale inferiore
rand(10)      –  Matrice con numeri casuali
hilb(5)          –  Matrice di Hilbert
magic(5)      –  Matrice magica
toeplitz         – Matrice di toeplitz

Ad esempio, zeros(m, n) produce una matrice mxn di zeri e zeros(n) produce un vettore di zeri; se A è una matrice, allora zeros(A) produce una matrice di zeri delle stesse dimensioni di A.

Se x è un vettore, diag (x) è la matrice diagonale con x lungo la diagonale, se A è una matrice quadrata, allora diag (A) è un vettore costituito dalla diagonale di A.

Le matrici possono essere costruite con blocchi. Per esempio, se A è un 3-x-3 matrice, allora

B = [A, zeros(3,2); zeros(2,3), eye(2)]

costruirà una matrice 5-x-5 .

generatore.matrici

Vediamo altri esempi:

Z = zeros(2,4) Z =
0 0 0 0
0 0 0 0

F = 5*ones(3,3) F =
5 5 5
5 5 5
5 5 5

N = fix(10*rand(1,10)) N =
4 9 4 4 8 5 2 6 8 0

R = randn(4,4) R =
1.0668 0.2944 -0.6918 -1.4410
0.0593 -1.3362 0.8580 0.5711
-0.0956 0.7143 1.2540 -0.3999
-0.8323 1.6236 -1.5937 0.6900

zeros All zeros

ones All ones

rand Uniformly distributed random elements

randn Normally distributed random elements.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le funzioni in Matlab

MATLAB

MATLAB prevede un gran numero di funzioni matematiche standard, tra le quali ci sono abs, sqrt, exp, e sin. La radice quadrata o il logaritmo di un numero negativo non è considerato un errore; il risultato complesso è prodotto in modo automatico. MATLAB prevede anche funzioni matematiche molto più avanzate, come le funzioni di Bessel e le gamma function.

La maggior parte di queste funzioni accettano argomenti complessi. Per avere un elenco delle funzioni matematiche elementari, basterà digitare al prompt di matlab:

help elfun

Per un elenco più avanzato delle funzioni matematiche e delle matrici digitare:

help specfun
help elmat

Alcune delle funzioni, come sqrt e sin, sono calcolate al momento in quanto sono parte del cuore di MATLAB quindi sono molto efficienti, ma i dettagli della computazione non sono prontamente accessibili. Le altre funzioni, come gamma e sinh sono perfezionate in M-files. Si può vedere il codice originario che le valuta ed eventualmente anche cambiarlo.

Molte funzioni speciali prevedono valori di costanti utili. Il valore infinito è generato dividendo un valore diverso da zero per zero, o valutando espressioni matematiche definite che tendono all’infinito. Il valore Not-a-number è invece generato tentando di valutare espressioni tipo 0/0 o Inf-Inf che non hanno valori matematici ben definiti. I nomi delle funzione non sono riservati. E’ quindi possibile utilizzare alcuni di tali nomi come una nuova variabile, ad esempio:

eps = 1.e-6

e poi usare quel valore in calcoli susseguenti. La funzione originale può essere ripristinata con il comando:

clear eps

funzioni.matlab2Alcuni nomi sono associati a precisi valori, come ad esempio:

pi : 3.14159265…
i : unità Immaginaria,
j : come i
eps : Floating-point con precisione, 2 -52
realmin : il più piccolo floating-point, 2 -1022
realmax : il più grande floating-point,(2-e)2 1023
Inf : Infinito
NaN : Not-a-number.

Abbiamo già ha visto molti esempi di espressioni di MATLAB. Di seguito ci sono altri esempi, e sono riportati i valori che ne risultano.

rho = (1+sqrt(5)) /2 rho = 1.6180
a = abs(3+4i) a = 5
z = sqrt(besselk(4/3,rho-i)) z = 0.3730+ 0.3214i
huge= l’exp(log(realmax)) huge = 1.7977e+308
toobig = il pi*huge toobig = Inf.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le operazioni aritmetiche in Matlab

MATLAB

Le operazioni possibili in ambiente MATLAB sono di tre tipi:

  1. aritmetiche,
  2. relazionali
  3. logiche.

In questo articolo ci soffermeremo solo sulle operazioni aritmetiche per lasciare spazio, in modo più dettagliato alle altre operazioni, in altri articoli.

Le operazioni aritmetiche disponibili sono:

  • + Addizione
  • – Sottrazione
  • * Moltiplicazione
  • / Divisione
  • \ Left division
  • ^ potenza
  • ‘ Asse coniugato complesso trasposto

Poichè MATLAB ha due tipi differenti di operazioni aritmetiche, un tipo per gli array e un tipo per le matrici, la moltiplicazione negli array deve essere preceduta dal punto, in modo da essere eseguita elemento per elemento; ad esempio se bisogna moltiplicare due vettori VET1 e VET2 bisognerà scrivere:

VET1.*VET2

prestando attenzione alle corrette dimensioni dei vettori.

operatori.aritmetici.matlab

Vediamo un esempio:

>> VET1=[1 2 3 4]

VET1 =

     1     2     3     4

>> VET2=[5 6 7 8]

VET2 =

     5     6     7     8

>> VET1.*VET2

ans =

     5    12    21    32

Per quanto riguarda invece le operazioni di somma e sottrazione non ci sono differenze tra array e matrici e quindi non si deve aggiungere il punto.

>> VET1+VET2

ans =

     6     8    10    12

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Rappresentazione dei numeri in Matlab

MATLAB

Per rappresentare i numeri MATLAB utilizza una notazione decimale e convenzionale, con un punto decimale e opzionale ed indicando quantità positive o il segno meno, per numeri negativi.

In notazione scientifica i numeri vengono rappresentati attraverso l’impiego di una lettera per specificare la potenza decimale. I numeri immaginari usano invece i o j, come suffisso.

In accordo con lo Standard ANSI/IEEE 754-1985 per l’aritmetica binaria floating-point, qualunque sia il sistema di numerazione scelto, le singole cifre dei numeri di macchina sono rappresentate nel calcolatore secondo il sistema binario e quindi con una sequenza di bit. Tuttavia, ciò non significa che i numeri siano trattati come se fossero binari.

Degli esempi di numeri rappresentati correttamente in Matlab sono:

3 -99
0.0001
9.6397238
1.60210e-20
6.02252e23
1i
-3.14159j

3e5i

Tutti i numeri che usano il format long specificato dall’IEEE sono immagazzinati internamente con lo standard floating-point. I numeri floating-point hanno una precisione limitata di 16 cifre decimali significative e una serie limitata da 10^-308 a 10^308+. (Il computer di VAX usa una configurazione diversa, ma la sua precisione e serie sono quasi le stesse.)

numeri.matlab

Nella rappresentazione floating point ogni numero può essere scritto come:

a = pN q

dove:

  • p è un numero reale.
  • N è la base del sistema di numerazione (nel caso binario N = 2).
  • q è un numero intero tale che m ≤ q ≤ M, m < 0 e M > 0

Fissata la base binaria, ogni numero reale a ≠ 0 è definito in modo univoco dalla coppia (p,q),
rispettivamente mantissa e caratteristica (esponente) di a.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le variabili in Matlab

MATLAB

Una variabile è un insieme di dati modificabili situati in una porzione di memoria (una o più locazioni di memoria) destinata a contenere dei dati, suscettibili di modifica nel corso dell’esecuzione di un programma. Una variabile è caratterizzata da un nome (inteso solitamente come una sequenza di caratteri e cifre).

MATLAB non richiede alcuna dichiarazione del tipo e della dimensione di una variabile. Quando MATLAB incontra un nome variabile nuovo, crea automaticamente la variabile e stanzia l’ammontare adatto in deposito.

Se la variabile già esiste, MATLAB cambia i suoi contenuti e, se necessario, effettua un nuovo deposito.Per esempio definiamo la seguente variabile:

>> elenco = 30

elenco =

    30

crea una matrice 1-by-1 (monodimensionale) di nome elenco e immagazzina il valore 30 come suo singolo elemento. I nomi delle variabili consistono di una lettera, seguita da qualsiasi numero di lettere, cifre o simbolo di sottolineatura.

variabili

MATLAB usa solamente i primi 31 caratteri di un nome di una variabile. MATLAB è inoltre case sensitive; distingue quindi tra uppercase e lowercase. A ed a non sono la stessa variabile.

Per analizzare la matrice assegnata a ciascuna variabile, basta semplicemente digitare il nome della variabile.

Ricordiamo infine che quando nel workspace di Matlab viene creata una variabile a cui non siè dato un nome, essa viene depositata nella varibile ans. La variabile ans viene creata quindi ogni volta che si esegue un’azione che non include una variabile MATLAB in modo da deporre il risultato in tale variabile. Ad esempio:

>>  [0:2:8]

ans =

0     2     4     6     8

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le operazioni in Matlab

MATLAB

In MATLAB sono definite le seguenti operazioni aritmetiche:

1) addizione +
2) sottrazione –
3) moltiplicazione *
4) divisione /
5) elevamento a potenza ˆ

Quando l’espressione da valutare è troppo lunga per stare su di un’unica riga di comando,risulta possibile utilizzare un carattere di continuazione dato da . . . (tre punti). Ad esempio:

>> 1 + 1/4 + …
1/8

ans =

    1.3750

E’ possibile verificare che poichè in MATLAB non vi è alcuna distinzione tra variabili intere, reali o complesse, il risultato dell’operazione di elevamento a potenza nel caso di esponenti frazionari può non corrispondere a quello naturalmente atteso. Ad esempio, volendo calcolare la radice cubica di -5, si ottiene:

>>  (-9)^(1/5)

ans =

   1.2555 + 0.9122i

quindi un numero immagginario al posto di un numero reale. Il problema è dovuto al fatto che MATLAB, lavorando in notazione complessa, calcola come prima radice cubica di -9 una delle due con parte immaginaria non nulla.

Anche in MATLAB è possibile alterare le precedenze classiche delle operazioni aritmetiche mediante l’uso opportuno delle parentesi tonde. Ad esempio, se nel caso precedente si fosse scritto ( – 9)*1/5 si sarebbe ottenuto il valore -1.8000 ossia, giustamente, – 9/5.

>> (- 9)*1/5

ans =

   -1.8000

operazioni.matlab

Per quanto riguarda i vettori, le operazioni elementari si estendono (quando ben definite) in modo del tutto naturale, con l’eccezione delle operazioni di divisione e di elevamento a potenza. Ad esempio,

>> a = [1:4];
>> b = [1:3];
>> c = [3 2 6 -1] ;

>> a+c (somma di vettori riga)

ans =

     4     4     9     3

>> a-c (differenza di vettori riga)

ans =

    -2     0    -3     5

>> a+b
??? Error using ==> plus
Matrix dimensions must agree.
 
>> a*c
??? Error using ==> mtimes
Inner matrix dimensions must agree.

Le ultime istruzioni ci indicano che, le operazioni fra vettori sono valide solo se le dimensioni sono consistenti. Infatti, dato un vettore riga s di dimensione n (ossia una matrice 1 * n) ed un vettore colonna d di dimensione m, si potrà eseguire il prodotto scalare s*d solo se m=n (ottenendo in tal caso uno scalare).

>> s=[1:4];

>> d=[1;2;3;4];

>> s*d

ans=
             30

Quindi d*s fornirà una matrice m*n.

>> s=[1:4];

>> d=[1;2;3;4];

>> M=d*s

M =

     1     2     3     4
     2     4     6     8
     3     6     9    12
     4     8    12    16

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

MATLAB