Tag Archives: lezioni matlab

La funzione size di Matlab

MATLAB

La funzione size di Matlab rappresenta un modo per ricavare le dimensioni di un array multidimensionale, infatti ci consente di ricavare i valori di ogni dimensioni dell’array.

La sintassi della funzione size è la seguente:

d = size (X)
 [m, n] = size (X)
 size = m (X, dim)
 [D1, D2, D3 ,…, dn] = size (X),

Allora la seguente linea di codice:

d = size (X)

restituisce i valori di ogni dimensione della matrice X restituendola in un vettore con d (X) elementi. Se X è uno scalare, restituisce il vettore [1 1]. Mentre:

[m, n] = size (X)

restituisce la dimensione della matrice X in due variabili separate m e n. Così:

size = m (X, dim)

restituisce il valore della dimensione di X specificata dallo scalare dim. Infine:

[D1, D2, D3 ,…, dn] = size (X)

per n> 1, restituisce i valori delle dimensioni della matrice X nella variabili D1, D2, D3 ,…, dn, a condizione che il numero di n argomenti di uscita sia uguale a nDims (X).

La funzione size di Matlab

Esempio 1
Il valore della seconda dimensione di rand (2,3,4) è 3.

size = m (rand (2,3,4), 2)
m =
 3

La dimensione è fornita come un singolo vettore.

d = size (rand (2,3,4))
d =
 2 3 4

I valori di ciascuna dimensione vengono assegnati a una variabile separata.

[m, n, p] = size (rand (2,3,4))
 m =
 2
n =
 3
p =
 4

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le procedure ricorsive in ambiente Matlab

MATLAB

Le procedure ricorsive in ambiente Matlab rappresentano una soluzione a diversi problemi che si incontrano nella pratica comune, nella sostanza una procedura ricorsiva non rappresenta altro che un programma che nella sua esecuzione chiama se stesso.

La Ricorsione è una costruzione subdola che permette di chiamare una funzione in se stessa. Ci sono molti pericoli usando la ricorsione. Il primo è che, come con i cicli while, è possibile per la funzione di chiamare se stesso per sempre e non fornire mai una risposta. La seconda è che la ricorsione può causare calcoli ridondanti che, anche se possono essere conclusi, possono richiedere molto tempo. Il terzo pericolo è che, mentre un programma ricorsivo è in esecuzione ha bisogno di spazio in più per accogliere l’overhead della ricorsione.

Ecco un semplice esempio di ricorsione:

function y=twoexp(n)

% y=twoexp(n). procedura ricorsiva per la valutazione di y=2^n.
% La procedura effettua una valutazione solo se n è maggiore di zero.

if n==0, y=1;
   else y=2*twoexp(n-1);
end

Il programma ha una struttura ramificata. La condizione n == 0 è la base della ricorsione. Questo è l’unico modo per ottenere che il programma smetta di chiamare se stesso. La parte contenuta in else è la ricorsione. Notate come il twoexp (n-1) si verifica proprio lì nel programma che sta definendo twoexp (n)! Il segreto è che è chiamata a un valore inferiore, n-1, e continuerà a farlo fino a quando non si mette n = 0. Una ricorsione di successo chiama sempre un valore inferiore.

matlab

L’uso della ricorsione può rendere più semplice la programmazione, il vantaggio consiste nel fatto che le funzioni ricorsive possono venire scritte tenendo conto della definizione ricorsiva stessa, per cui si ottengono facilmente dei programmi corretti senza dover simulare lo stato della memoria.

La tecnica ricorsiva permette di scrivere algoritmi eleganti e sintetici per molti tipi di problemi comuni, anche se non sempre le soluzioni ricorsive sono le più efficienti. Questo è dovuto al fatto che comunemente la ricorsione viene implementata utilizzando le funzioni, e che l’invocazione di una funzione ha un costo rilevante, e questo rende più efficienti gli algoritmi iterativi.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Sottomatrici e operatore due punti in Matlab

MATLAB
I Vettori e le sottomatrici sono spesso usati in MATLAB per ottenere complessi effetti di manipolazione dei dati. L’operatore due punti, che viene spesso utilizzato in Matlab sia per generare vettori e sottomatrici di riferimento sia per indicizzare dei vettori, risulta fondamentale per la manipolazione efficiente di questi oggetti.

Un uso creativo delle sottomatrici e operatore due punti in Matlab consente di minimizzare l’uso di loop, che rallentano MATLAB, e rende il codice semplice e leggibile, senza che l’utente debba applicare alcuno sforzo per acquisire familiarità con essi.

L’ espressione 01:05 è in realtà il vettore riga [1 2 3 4 5]. I numeri non devono essere interi, né l’incremento deve essere necessariamente unitario. Per esempio:

0.2:0.2:1.2

ci permette di ottenere il vettore seguente

[0.2, 0.4, 0.6, 0.8, 1.0, 1.2]

mentre la notazione seguente:

5:-1:1

ci permette di ottenere il vettore seguente

[5 4 3 2 1]

Le dichiarazioni che seguono, per esempio, ci permettono di generare una tavola con i valori della funzione seno in specifici punti. Proviamo:

x = [0.0:0.1:7.0];
y = sin (x);
[x y]
plot(x,y)

Si noti che, poiché la funzione seno opera su ogni elemento del vettore argomento, si produce un vettore y degli stessi elementi del vettore x. In questo modo si ottiene il seguente grafico:

Sottomatrici e operatore due punti in Matlab

La notazione due punti può essere utilizzata per accedere a sottomatrici di una matrice. Allora definiamo una matrice A:

A = [1 2 3; 4 5 6; 7 8 9]

Allora per esempio digitando sulla riga di comando la seguente notazione

A (1:4,3)

si ottiene un vettore colonna costituito dai primi quattro elementi della terza colonna di A.
L’operatore due punti di per sé denota una riga o colonna:

A (:, 3)

è la terza colonna di A, mentre

A (1:4,:)

sono le prime quattro righe di A.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Come definire una funzione in Matlab

MATLAB
Le Funzioni in matlab sono M-file che possono accettare argomenti d’entrata e forniscono argomenti di uscita. Il nome dell’M-file e della funzione deve essere lo stesso. Le Funzioni operano su variabili definite nel workspace proprio, separato dal workspace a cui si accede all’ingresso di MATLAB, cioè le variabili usate all’interno della funzione sono locali.

Vediamo come definire una funzione in Matlab con parametri in ingresso e parametri in uscita. Si voglia costruire una funzione che, dati i lati ”a” e ”b” di un rettangolo fornisca l’area ”A”, il perimetro ”p” e la diagonale ”d”. Indichiamo con (a; b) la lista d’ingresso (parentesi tonde) e con [A; p; d] la lista d’uscita (parentesi quadre) (si noti la virgola fra i parametri).

function [ A , p , d ] =rettang ( a , b )
A = a * b; 
p = 2 * ( a + b );
d =sqrt ( a^2 + b^2 );

Si noti che non c’è confusione tra la lettera A (maiuscolo) e la a (minuscolo) perchè MATLAB distingue le lettere maiuscole dalle minuscole. Questa function, salvata con il nome rettang.m può essere richiamata da un altro modulo o direttamente dalla finestra comandi ad esempio con il comando:

[area; perim; diag] =rettang(2; 3)

Quindi la sintassi da utilizzare è la seguente:

function [lista d'uscita] = nome (lista d'ingresso)

Un buono esempio è fornito dalla funzione rank. L’M-file rank.m è disponibile nella directory toolbox/matlab/matfun. Si può lanciare il file digitando:

rank

Il file in questione è il seguente.

function r = rank(A,tol)
% RANK Matrix rank.
% RANK(A) provides an estimate of the number of linearly
% independent rows or columns of a matrix A.
% RANK(A,tol) is the number of singular values of A
% that are larger than tol.
% RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.
s = svd(A);
if nargin==1
tol = max(size(A)) * max(s) * eps;
end
r = sum(s > tol);

La prima linea di una funzione M-file inizia con la funzione keyword. La quale da il nome alla funzione ed ordina gli argomenti. In questo caso,ci sono due argomenti di input ed uno di output. Le righe seguenti,che iniziano con il simbolo %, rappresentano dei commenti per un aiuto, non vengono considerate nell’applicazione. Queste linee si stampano quando si digita:

help rank

La prima linea del testo di aiuto è la H1 line che MATLAB espone quando si ricerca aiuto digitando help on nella directory che contiene la funzione. Il resto del file rappresenta codice eseguibile MATLAB definendo la funzione. La variabile s presente nel corpo della funzione, cosìcome le variabili sulla prima fila r, A e tol, sono del tutto locali alla funzione; sono indipendenti e separate da qualsiasi variabile nel workspace di MATLAB. Questo esempio illustra un aspetto delle funzioni di MATLAB, che ordinariamente non si trova negli altri linguaggi di programmazione , un numero variabile di argomenti. La funzione rank può essere usata in molti modi diversi:

rank(A)
r = rank(A)
r = rank(A,1.e-6)

Ricordiamo ancora una volta che se nessun argomento di output è fornito, il risultato è immagazzinato nella variabile ans. Se il secondo argomento di input non è fornito, la funzione calcola un valore di default. Fra il corpo della funzione, due quantità chiamate nargin e nargout sono disponibili, le quali ci dicono il numero di argomenti di input e di output coinvolti in ciascun uso della funzione. La funzione rank usa nargin, ma non ha bisogno di usare nargout.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le istruzioni try e catch in Matlab

MATLAB
Le istruzioni try e catch in Matlab  consentono di ignorare il comportamento di errore predefinito per un insieme di istruzioni di programma. Se qualsiasi dichiarazione in un blocco try genera un errore, il controllo del programma passa immediatamente al blocco catch, che contiene le istruzioni di gestione degli errori.

Attraverso l’oggetto exception della classe MException, che risulta opzionale per il blocco catch, è possibile identificare l’errore.

L’esempio seguente mostra un blocco try / catch all’interno di una funzione che moltiplica due matrici. Se un’istruzione nel segmento try del blocco fallisce, il controllo passa al segmento di cattura. In questo caso, le dichiarazioni di cattura controllano il messaggio di errore che è stato rilasciato (restituito dall’oggetto lasterr) e rispondeno in modo appropriato.

try
   X = A * B
catch
   errmsg = lasterr;
   if(strfind(errmsg, 'Inner matrix dimensions'))
      disp('** Dimensione errata per le matrici')
end

Entrambi i blocchi try e catch possono contenere ulteriori dichiarazioni nidificate try / catch.

try
   statement1                      % Esecuzione statement1
catch
   try
      statement2                   % Tentativo di recupero errore
   catch
      disp 'Operazione fallita'    % manipolazione errore
   end
end

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Istruzione continue in Matlab

MATLAB

L’istruzione continue in Matlab interrompe temporaneamente l’esecuzione di un ciclo di programma, saltando eventuali istruzioni rimanenti nel corpo del ciclo. L’istruzione continue non provoca l’uscita immediata dal ciclo, come fa invece l’istruzione break o return, ma  continua all’interno del ciclo finché la condizione imposta da un ciclo for o while risulta soddisfatta.

L’istruzione continue in Matlab, nel caso fosse presente in un ciclo annidato, si comporta nello stesso modo. L’esecuzione è arretsta per la parte rimanete di programam presente nel ciclo for o while in cui si era verificato l’istruzione continue, e rientra nel ciclo se la condizione imposta restituisce true.

Vediamo allora un esempio che fa suo dell’istruzione continue in Matlab:

for k=-10:1:10
     if (k^2-30<0)
         continue;
     end
     val=k^2-30;
     fprintf('\n k=%g  val=%g',k,val)
 end

Il ciclo proposto valuta l’espressione k ^ 2-30 per k che va da -10 a 10 con passo unitario; tale valutazione però è efefttuata nel solo caso in cui tale espressione fornisce un valore positivo in quanto se dovesse risutare negativo l’istruzione continue non permetet l’esecuzione della parte restante del codice.

Istruzione continue in Matlab

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Ciclo Repeat in Matlab

MATLAB

Il ciclo Repeat in Matlab è caratterizzato dalla struttura REPEAT – END_REPEAT che rappresenta un ciclo che valuta il suo corpo fino a quando una condizione è soddisfatta. In un ciclo di ripetizione, prima è valutato il segmento di programma inserito nella struttura, poi viene effttuato il controllo sulla condizione e si ripete il ciclo fino a quando tale condizione restituisce TRUE. In contrasto con il ciclo while, nel ciclo repeat le istruzioni in esso contenute sono sempre valutate almeno una volta.

La sintassi del Ciclo Repeat in Matlab è la seguente:

repeat
  corpo del programma
until condizione end_repeat

Il corpo del programma può essere costituito da qualsiasi numero di istruzioni che devono essere separati mediante due punti: o una virgola;. Solo l’ultimo risultato valutato all’interno del corpo (il valore di ritorno del loop) è stampato su schermo. È possibile, a tal proposito, utilizzare il comando print per stampare a video i risultati intermedi.

La condizione contenuta nell’espressione booleana deve restituire un valore del tipo VERO o FALSO. La parola chiave  END_REPEAT può essere sostituita dalla parola chiave END.

Vediamo un esempio:

i := 1:
repeat 
  print(i);
  i := i + 1;
until i = 3 end:

In questa applicazione del ciclo Repeat in Matlab eseguiamo un ciclo che viene ripetuto fino a quando la condizione i=3 risulta vera. Stampiamo ad ogni opassaggio il valore di i in modo da verificare il corretto funzionamento.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Istruzione break in Matlab

MATLAB

L’istruzione break in Matlab interrompe l’esecuzione di un ciclo for o while. In tal caso le dichiarazioni del ciclo presenti dopo l’istruzione break non vengono eseguite. Nei cicli nidificati, l‘istruzione break in Matlab esce solo dal ciclo in cui si verifica, cosicchè il controllo passa all’istruzione che segue la fine di tale ciclo.

Tale tipo di istruzione viene di solito inserita in un codice per assicurare l’uscita dal ciclo nell’eventualità accada una specifica condizione. Questo è dovuto principalmente al fatto che deve essere evitata l’ipotesi che il ciclo continui ad iterare all’infinito.

Vediamo allora un alògoritmo che implemeta l’istruzione break al fine di uscire dal ciclo nel caso si verifichi una particolare condizione:

a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
  x = (a+b)/2;
  fx = x^3-2*x-5;
  if fx == 0
    break
  elseif sign(fx) == sign(fa)
    a = x; fa = fx;
  else
    b = x; fb = fx;
  end
end
x

Nel caso specifico è stato inserito un controllo per verificare quando la funzione risulta pari a zero in tal caso l’istruzione break determina l’uscita dal ciclo.

Istruzione  BREAK

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Ciclo While in Matlab

MATLAB

Il ciclo while in Matlab ripete un gruppo di istruzioni un numero indefinito di volte attraverso il controllo di una condizione logica. L’istruzione END posta alla fine del ciclo ne delinea le istruzioni.

Il ciclo while in Matlab si utilizza quando non si conosce in anticipo il numero di volte per il quale il ciclo dovrà essere ripetuto. Prima di ogni ripetizione, Matlab verifica la condizione, se risulta vera il ciclo sarà eseguito; allora vengono eseguite tutte le istruzioni presenti fino all’istruzione end, arrivati a questo punto è nuovamente verificatala condizione. Se risulta ancora vera il ciclo viene eseguito nuovamente…. Quando Matlab verifica che la condizione è diventata falsa il ciclo termina e vengono eseguite le istruzioni successive all’end. La variabile contenuta nella condizione prende il nome di variabile di ciclo.

Ciclo While in Matlab

Di seguito è riportato un programma completo, che illustra in modo semplice ed immediato l’utilizzo corretto delle strutture di controllo del flusso while e if. Il programma utilizza il metodo della bisezione per trovare uno zero di un polinomio.

a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
  x = (a+b)/2;
  fx = x^3-2*x-5;
  if sign(fx) == sign(fa)
    a = x; fa = fx;
  else
    b = x; fb = fx;
  end
end
x

Il risultato è la radice del polinomio x3 – 2x – 5, vale a dire:

x = 2.09455148154233

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Cicli FOR in Matlab

MATLAB

Per implementare dei Cicli FOR in Matlab bisogna utiizzare l’istruzione for che ripete un gruppo di istruioni un numero fissato di volte . Il ciclo viene terminato dall’istruzione END. Il ciclo for è una struttura di controllo iterativa che determina l’esecuzione di una porzione di programma ripetuta per un certo numero noto di volte.

Vediamo un esempio:

for n = 3:32
   r(n) = rank(magic(n));
end
r

Il punto e virgola che termina l’istruzione sopprime la stampa ripetuta, e il termine r dopo il loop espone a video il risultato finale.

Cicli FOR in Matlab

E’ buona norma ordinare i loop al fine di una discreta leggibilità; per fare questo è necessario identare il testo come nell’esempio proposto:

for i = 1:m
  for j = 1:n
    H(i,j) = 1/(i+j);
  end
end

In tale esempio è stato implementato un ciclo for annidato, in cui vengono utilizzati due cicli for per eseguire un doppio ciclo su una varibile strutturata.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Struttura switch e case in Matlab

MATLAB

La struttura switch e case in Matlab ci consente di eseguire gruppi di istruzioni basati sul valore di un variabile o di un’espressione. La keywords case e otherwise delinea i gruppi. Solamente il primo caso è eseguito. Ci deve essere sempre una parola chiave end per lo statement switch .

La logica dell’algoritmo della matrice magic square può, ad esempio, essere descritta anche con il seguente codice Matlab:

switch (rem(n,4)==0) + (rem(n,2)==0)
  case 0
    M = odd_magic(n)
  case 1
    M = single_even_magic(n)
  case 2
    M = double_even_magic(n)
  otherwise
    error('This is impossible')
end

Diversamente dal linguaggio C, lo switch di MATLAB non commette errori. Se la prima istruzione del costrutto case risulta vera, il restante case statement non è eseguito. Così, non si rendono necessari break statement.

Vediamo ora un altro esempio in cui si visualizza un altro testo condizionale, in funzione di un valore immesso al prompt dei comandi.

n = input('Inserisci un numero: ');

switch n
    case -1
        disp('negativo')
    case 0
        disp('zero')
    case 1
        disp('positivo')
    otherwise
        disp('altro valore')
end

La struttura switch e case in Matlab

LINK DI APPROFONDIMENTO PER L’ARGOMENTO: