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