next up previous

Strutture di controllo del flusso


MATLAB ha cinque strutture di controllo di flusso: 
 

1) if statements  
2) switch statements  
3) for loops  
4) while loops  
5) break statements 


  • if statement
  • La struttura if valuta un'espressione logica e esegue un gruppo di asserzioni quando l'espressione è vera. L'else if opzionale e altre keywords provvedono per l'esecuzione di gruppi alternati di asserzioni. Una keyword END termina l'ultimo gruppo di asserzioni. I gruppi di asserzioni sono delineati da quattro keywords non sono previste { o [ . L'algoritmo di MATLAB per generare una magic square di ordine n coinvolge tre casi diversi: quando n è dispari, quando n è pari ma non divisibile per 4, o quando n è divisibile per 4. Questo è descritto dal costrutto seguente: if rem(n,2) ~= 0 M = odd_magic(n) elseif rem(n,4) ~= 0 M = single_even_magic(n) else M = double_even_magic(n) end In questo esempio, i tre casi sono mutuamente esclusivi, ma se loro non lo fossero, la prima condizione vera sarebbe eseguita. Tutto ciò è importante per capire come gli operatori relazionali e le strutture if lavorano con le matrici. Quando si vuole controllare l'uguaglianza tra due variabile, usare: if A == B, .... Questo è legale in MATLAB, e fa quello che ci si aspetta quando A e B sono scalari. Ma quando A e B sono matrici, A == B non esamina se loro sono uguali, esamina solo dove loro sono uguali; il risultato è un altra matrice di 0 e di 1 che espone l'uguaglianza elemento per elemento. Infatti, se A e B non sono la della stessa taglia, allora A == B è un errore. Il modo corretto per controllare l'uguaglianza tra due variabile è quello di usare la funzione isequal: if isequal(A,B), ... Qui c'è un altro esempio per enfatizzare questo punto. Se A e B sono scalari, il programma seguente mai arriverà alla situazione inaspettata. Ma per la maggior parte delle matrici, includendo le nostre magic square con colonne scambiate nessuna delle condizioni seguenti A> B, A> B o A == B è vero per tutti gli elementi e così l'altra clausola è eseguita. if A > B 'greater' elseif A < B 'less' elseif A == B 'equal' else error('Unexpected situation') end Molte funzioni sono utili per ridurre i risultati di paragoni tra matrici e condizioni scalari attraverso l'uso dell'IF, includendo le seguenti: isequal isempty all any
  • switch e case
  • L'asserzione switch esegue gruppi di asserzioni basati sul valore di un variabile o espressione. La keywords case e otherwise delinea i gruppi. Solamente il primo caso è eseguito. Ci deve essere sempre una fine per lo statement switch . La logica dell'algoritmo delle magic square può essere descritta anche con: 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 fa fiasco. Se la prima asserzione del case è vera, il restante case statement non è eseguito. Così, break statement non sono richiesti.
  • for statement
  • Il loop for ripete un gruppo di asserzioni un numero fisso di volte . Un END statement termina le asserzioni. for n = 3:32 r(n) = rank(magic(n)); end r Il punto e virgola che termina l'asserzione sopprime la stampa ripetuta, e il termine r dopo il loop espone il risultato finale. È una buona idea per ordinare i loop al fine di una discreta leggibilità, identare il testo ad esempio: for i = 1:m for j = 1:n H(i,j) = 1/(i+j); end end.
  • while statement
  • Il ciclo while ripete un gruppo di asserzioni un numero indefinito di volte attraverso il controllo di una condizione logica. Un END delinea le asserzioni. Di seguito è riportato un programma completo, illustrando while, if, else, e end, il quale 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 x^3 - 2x - 5, vale a dire x = 2.09455148154233
  • break statemant
  • L'asserzione break lascia che si esca velocemente da un loop FOR o WHILE. In un ciclo innestato,break esce dal ciclo interno solamente . Qui c'è un miglioramento sull'esempio della sezione precedente. Perchè è una buona idea questo uso di break ? 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