Programmare in Scilab - Dipartimento di Informatica

Transcript

Programmare in Scilab - Dipartimento di Informatica
Programmare in
Scilab: Matrici
Booleane – Strutture di
Controllo
Corso di Informatica
CdL: Chimica
Claudia d'Amato
cl audi a.damat o@di .uni ba.i t
Programmazione in Scilab
 Scilab
dispone di un linguaggio di
programmazione semplice e completo
 Differenza principale dagli altri
linguaggi


le variabili non necessitano di
dichiarazione
l'inizializzazione comprende la
dichiarazione
Operatori di confronto e logici
 Operatori di confronto






==
uguale a
<
minore
>
maggiore
<=
minore uguale
>=
maggiore uguale
<> o ~=
diverso
 Operatori



&
|
~
and
or
not
logici
Esempi
 Eseguire i seguenti esempi










3 <> 2 <return>
3 == 3 <return>
(2 > 1) & (3 > 5) <return>
(2<1) & (3>5) <return>
(2>1) | (3<4) <return>
(2<1) | (3>5) <return>
(2<1) | (3<5) <return>
~(2<1) <return>
~(2>1) <return>
~(2>1) | (3>5) <return>




Espressioni di Confronto tra
Matrici
--> A = [1 2; 3 4];
--> B = [3 4; 0 2];
--> A < B
ans =
T
T
F
F
--> A < 3
ans =
T
T
F
F
Espressioni Logiche e Matrici
Booleane





--> a = [%t %f %t];
--> b = [%f %f %t];
--> a & b
ans = F F T
--> a | b
ans = T F T
--> ~a
ans = F T F
Funzioni Booleane applicate a
Matrici...
 La funzione bool2s




Applicata a matrici booleane restituisce una
matrice dove %t → 1 e %f--> 0
--> bool2s([%t %f %t])
ans = 1 0 1
Applicata a matrici “standard” restituisce una
matrice dove tutti i valori non nulli sono
rimpiazzati con 1
→ bool2s([5 0 3 2 0])
...Funzioni Booleane applicate a
Matrici
 La funzione find(x) dove x matrice
(booleana)



Restituisce il vettore degli indici per cui x(i) è
"vera". La matrice vuota è restituita se nessun
valore vero è ritrovato
--> x = [1 3 4 2 0 1];
--> find(x<2)
ans =
1 5 6
I cicli
 Scilab prevede il ciclo while e il ciclo for
 Ciclo for


for indice = valore_iniziale : incremento : valore_finale,
... istruzioni ...,
end
for indice = valore_iniziale : valore_finale,
... istruzioni ...,
end
 Se l'incremento non è esplicitato è pari a 1
 Quando si scrivono degli script le istruzioni
possono essere scritte una per linea

una linea corrisponde ad una virgola
Esempi
1) for k = 1:0.5:4, r=r+k, end <return> //err.
2)r = 1; for k = 1:0.5:4, r=r+k, end <return>
3)r = 1; for k = 1:0.5:4, r=r+k;, end <return>
4)xs=-1.0; dx=0.25; n=10; for j=1:n,
x=xs+(j-1)*dx, end <return>
5)for m=1:10, a(m) = m^2, end <return>
6)a <return>
Perchè al punto 1) si ha errore mentre al
punto 5) non si ha errore???
Ciclo For e Vettori...
 Se il ciclo for viene usato per ciclare sulle
componenti di un vettore la variabile
vettore può essere usata per
l'inizializzazione dell'indice
 Il ciclo for itera sulle componenti di un
vettore riga
 il numero di iterazioni è governato dal
numero di componenti del vettore riga

for variabile=vettore, istruzioni, end
...Ciclo For e Vettori...
Esempio:


--> v = [1 -1 1 -1]
-> y=0; for k=v, y=y+k, end
 Il numero di iterazioni è governato dal
numero di componenti del vettore riga
alla i-esima iterazione il valore di k è uguale
a v(i)
 Esercizio: Realizzare un ciclo for con un
vettore colonna
...Ciclo For e Vettori
 Le istruzioni per il seguente for


--> v = [1 -1 1 -1]
-> y=0; for k=v, y=y+k, end
 potrebbero essere scritte in modo più
naturale e leggibile come

y=0; for i=1:4, y=y+v(i), end
 O meglio ancora come

y=0; for i=1:length(v), y=y+v(i), end
Ciclo For e Matrici
 Il ciclo for può essere usato anche per
ciclare su elementi di matrici

for variabile=matrice, istruzioni, end
 Il ciclo for itera sulle componenti della
matrice colonna per colonna


--> z = [1 -1 1 4; -1 5 6 2; 5 7 8 1]
-> y=0; for k=z, y=y+z, end
 il numero di iterazioni è governato dal
numero di colonne della matrice

alla i-esima iterazione il valore di k è uguale a
z(i)
Esempio: Media degli elementi
di un vettore
 program1.txt
clear //pulisce tutte le varibili
x = [10. -1. 3. 5. -7. 4. 2.];
suma = 0;
[n,m] = size(x); //alternativa m = length(x)
for j=1:m
suma=suma+x(j);
end
mean = suma/m;
mean
Media Colonne di Matrice
 n = 10;
m = 7;
M = rand(n,m);
T = zeros(1,m);
for j=1:m
somma=0;
for i=1:n
somma = somma + M(i,j);
end
T(j) = somma / n;
end
 Costrutto while

Il costrutto while
while condizione, ... instruzioni ..., end
 Esempio




s=100; while s>50, disp(s^2), s=s-5, end
<enter>
La funzione disp visualizza il contenuto della
variabile passata come argomento
In uno script (o funzione) è possibile scrivere:
s = 100
while s>50
disp(s^2)
s = s-5
Esercizio: Realizzare la REPEAT-UNTIL
Il ciclo while
 La sintassi del while

while condizione, istruzione1, ..., istruzionen,
end
 In uno script è possibile scrivere

while condizione
istruzione1
...
istruzionen
end
Somma degli elementi di un
vettore
 media.sce
clear
x = [10. -1. 3. 5. -7. 4. 2.];
somma = 0;
[n,m] = size(x); //alternativa m = length(x)
for j=1:m
somma=somma+x(j);
end
disp(somma)

Esercizio: realizzare lo stesso programma con il
cotrutto while
Il costrutto condizionale: if...
then... else...
●
●
●
if condizione then istruzioni, end
if condizione then istruzioni, else istruzione,
end
if condizioneA then istruzioni, elseif
condizioneB then istruzioni, elseif
condizioneC then istruzioni, ...., else
istruzioni, end
N.B.: In uno script le istruzioni possono essere
scritte una per linea senza l'uso delle virgole
if... then... else...: Esempi
Esempi
1) x=10; y=5; if x>5 then disp(y), end <enter>
2)x=3; y=5; if x>5 then disp(y), else disp(x), end
<enter>
3)x=3; y=5; z=4; if x>5 then disp(y), elseif x>6
then disp(x), else disp(z), end <enter>
Il costrutto condizionale: select Forma generale:
case


select varibile, case n1, istuzioni, case n2,
istruzioni,...., [else istruzioni,] end
Dove n1,n2... sono i valori di “variabile”
Esempi:
1) x=-1; select x, case 1, y=x+5, case -1, y=sqrt(x),
end <return>
2)r=7; select r, case 1, disp(r), case 2, disp(r^2), case
7, disp(r^3), end <return>
N.B.: In uno script le istruzioni possono essere
scritte una per linea senza l'uso delle virgole
Esempio
x = 5;
s = x;
while s>1
s=s–2
end
if s==0 then
disp(%t)
else
disp(%f)
Somma degli elementi dispari
di un vettore
clear
x = [10. -1. 3. 5. -7. 4. 2.];
sommadisp = 0;
[n,m] = size(x);
for j=1:m
if modulo(x(j),2)<>0 then
sommadisp=sommadisp+x(j);
end
end
disp(sommadisp)
Somma degli elementi in
posizione pari
clear
x = [10. -1. 3. 5. -7. 4. 2.];
somma = 0;
[n,m] = size(x);
for j=1:m
if modulo(j,2)==0 then
somma=somma+x(j);
end
end
disp(somma)