Sei sulla pagina 1di 33

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Lab 5 Info B

Manuel Roveri - manuel.roveri@polimi.it


Marco D. Santambrogio marco.santambrogio@polimi.it
Ver. aggiornata al 11 Settembre 2014

Calendario dei Labs


DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

15 Dicembre 2014, 3pm-5pm, @ LM1


MATLAB: ambiente di sviluppo e primi
codici

12 Gennaio 2015, 3pm-7pm, @ LM1


MATLAB: strutture di controllo, tipi di dato
strutturato, e vettori

26 Gennaio 2015, 3pm-7pm, @ LM1


MATLAB: funzioni ricorsive, funzioni di
ordine superiore, grafici 2D e 3D
2

Lab 5: Obiettivi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Introduzione a Matlab/Octave
Cicli
Funzioni
Strutture

Lab 5: Agenda
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Warm Up (40)
Qualche cosa un po' pi divertente
(90)
Altri exe (110)

Lab 5: Warm up
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Warm Up (40)
Inserisci numeri
Temperatura
mcm

Qualche cosa un po' pi divertente


(90)
Altri exe (110)

Problema: Inserisci numeri


DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Acquisiamo numeri da tastiera


finch non viene inserito un
numero negativo.
In ogni caso non accettiamo pi di
mille numeri

Soluzione: Inserisci
numeri

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

vector = [ ]; %crea il vettore vuoto


for count = 1:1000 %Raccoglier al max 1000 valori
value = input('next number ');
if value < 0
break %Se value negativo usciamo dal ciclo
else
vector(count) = value;
end
end
vector %permette di visualizzare il contenuto di vector

Problema: Temperatura
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Scrivere un programma che prende


in input la temperatura in gradi
Celsius e restituisce in output i
gradi Fahrenheit
Formula:
Fahrnait = Celsius * 9/5 + 32

Soluzione: Temperatura
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

temp_c = input('Inserire la temperatura in gradi


Celsius: ');
temp_f = temp_c * 9/5 + 32;
disp(['La temperatura in gradi Fahrenheit ',
num2str(temp_f)]);

mcm: problema
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Dati due numeri x ed y, si definisce


il minimo comune multiplo come
mcm = x*y/MCD(x,y)

Si risolve il problema creando una


funzione mcm

10

mcd (verboso)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

function [div] = mcd(x,y)


if(x == y)
div = x;
elseif(x < y)
for cont = x:-1:1
if mod(x,cont) == 0 && mod(y,cont) == 0
div = cont;
break
end
end
else
for cont = y:-1:1
if mod(x,cont) == 0 && mod(y,cont) == 0
div = cont;
break
end
end
end

11

mcm in Octave
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

function [mul] = mcm(x,y)


mul = x * y / mcd(x,y);

12

Lab 5: Un po di
divertimento

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Warm Up (40)
Qualche cosa un po' pi divertente
(90)
Maggiore
Equazione secondo grado
Rilievi altimetrici

Altri exe (110)


13

Problema: Maggiore
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Scrivere un programma che prenda


in input un array e conti tutti i
numeri che sono maggiore di un
numero n inserito dallutente

14

Soluzione: Maggiore
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

mag = input('Vuoi contare i numeri maggiori di quanto? ');


disp('Array (ricorda di inserire i numeri tra parentesi
quadre):');
inarray = input('');
counter = 0;
for ii=1:length(inarray)
if inarray(ii)>mag
counter = counter+1;
end
end
disp(['I numeri maggiori di ',num2str(mag),' sono
',num2str(counter)]);

15

Soluzione: Maggiore
righe)

(in due

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

mag = input('Vuoi contare i numeri maggiori di quanto? )


disp('Array (ricorda di inserire i numeri tra parentesi
quadre):)
inarray = input()
magV= inarray(inarray>mag);
counter = size(magV,2);
disp(['I numeri maggiori di ',num2str(mag),' sono
',num2str(counter)]);

16

Problema: Equazione secondo


grado

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Scrivere una funzione per il calcolo


dell'equazione di secondo grado:
ax^2 + bx + c.
Inseriti a, b e c la funzione deve
ritornare il valore di delta, e i valori
delle radici reali (se esistono).
In caso che delta sia uguale a 0, x1
contiene la soluzione, mentre x2 non
un numero (NaN).

17

Soluzione: Equazione secondo


grado

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

function [delta, x1, x2] = eq2g(a,b,c)


delta = b^2-4*a*c;
if (delta==0)
x1=(-b)/(2*a);
x2=(-b)/(2*a);
else
x1=(-b+sqrt(delta))/(2*a);
x2=(-b-sqrt(delta))/(2*a);
end

18

Esercizio: Rilievi
altimetrici

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Si sviluppi un programma in
matlab che acquisisce da tastiera i
dati relativi a rilievi altimetrici e
stampa a video laltitudine media
di tutti quelli che hanno latitudine
compresa tra 10 e 80 e longitudine
tra 30 e 60

19

Soluzione (1ma parte): rilievi


altimetrici

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

more = input('vuoi inserire valori altimetrici? (s/n)');


ii=1;
while more=='s'
arch(ii).altitudine = input('altitudine ');
arch(ii).longitudine = input('longitudine ');
arch(ii).latitudine = input('latitudine ');
ii = ii+1;
more = input('vuoi inserire altri valori altimetrici? (s/n)');
end

20

Soluzione (2nda parte): rilievi


altimetrici

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

jj=1;
for ii=1:length(arch)
%attenzione: la condizione deve essere scritta sulla
stessa linea
if arch(ii).latitudine>=10&&arch(ii).latitudine<=80 &&
arch(ii).longitudine>=30&&arch(ii).longitudine<=60
elemSelez(jj) = arch(ii).altitudine;
jj=jj+1;
end
end
disp(['la media degli elementi selezionati e` '
num2str(mean(elemSelez))]);

21

Lab 5: Altri exe


DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Warm Up (40)
Qualche cosa un po' pi divertente
(90)
Altri exe (110)

Cambio base
Scambio elementi
Matrici
Citt
22

Problema: Cambio base


DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Ricevere un vettore che


rappresenti le singole cifre di un
numero in base 2 stampare a video
il valore in base 10

23

Cambio base - Soluzione


DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

function [ris] = cambioBase(n)


% N vettore di 0 e 1
esp=[length(n)-1:-1:0];
Basi=2.^esp;
disp(sum(n.*basi));

24

Problema: Scambio
elementi

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Scrivere un programma che dati


due array scambi gli elementi di
indice dispari
usare la funzione mod

25

Soluzione: Scambio
elementi

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

function [inarray1, inarray2] = swapOdd(inarray1,


inarray2)
for ii=1:min(length(inarray1),length(inarray2))
if (mod(ii,2) == 1)
temp=inarray1(ii);
inarray1(ii)=inarray2(ii);
inarray2(ii) = temp;
end
end

26

Soluzione: Scambio
elementi

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

disp('Array1 (ricorda di inserire i numeri tra parentesi


quadre):');
inarray1 = input('');
disp('Array2 (ricorda di inserire i numeri tra parentesi
quadre):');
inarray2 = input('');
[inarray1, inarray2] = swapOdd(inarray1, inarray2);
disp('Ora gli array sono: ');
disp(inarray1);
disp(inarray2);

27

Problema: Matrici
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Date le seguenti matrici A e B:


A = [1 3 -2 -2; 0 2 4 -5; -1 2 3 2; 0 -1 -9 3];
B = [2 0 4 -10; 1 -2 -4 0; 6 -2 -2 1; 3 2 -4 -9];
Si verifichi che
AB != BA, (A*B)T != AT*BT
ma che (AB)T = BT*AT (T significa matrice
trasposta).

Provare anche che (A + B)2 != A2 + 2AB +


B2.

28

Soluzione: Matrici

(prima parte)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

AB=A*B;
BA=B*A;
val = (AB==BA);
if (sum(sum(val))==0)
disp('Le due matrici A*B e B*A sono diverse');
else
disp('Le due matrici A*B e B*A sono uguali');
end
ABT = (A*B)';
ATBT = (A')*(B');
val = (ABT==ATBT);
if (sum(sum(val))==0)
disp('Le due matrici (A*B)T e AT*BT sono diverse');
else
disp('Le due matrici (A*B)T e AT*BT sono uguali');
end

29

Soluzione: Matrici
parte)

(seconda
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

ABT = (A*B)';
BTAT = (B')*(A');
val = (ABT==BTAT);
if (sum(sum(val))==0)
disp('Le due matrici (A*B)T e BT*AT sono diverse');
else
disp('Le due matrici (A*B)T e BT*AT sono uguali');
end
PR = (A+B)^2;
SE = (A^2)+(2*A*B)+(B^2);
val = (PR==SE);
if (sum(sum(val))==0)
disp('Le due matrici (A + B)2 e A2 + 2AB + B2 sono diverse');
else
disp('Le due matrici (A + B)2 e A2 + 2AB + B2 sono uguali');
end

30

Problema: Citt
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Sono date N citt definite dalle loro coordinate euclidee


(x,y). Tali coordinate sono scritte in due vettori di N
elementi ciascuno (un vettore per le x, uno per le y). Ad
esempio, x(1) e y(1) rappresentano le coordinate per la
prima citt.
Generare casualmente i vettori x e y come segue:
x=rand(1,N); y=rand(1,N); osservare i valori risultanti, ed
eventualmente moltiplicare i due vettori per 100 in modo
che tali valori possano essere interpretati come coordinate
espresse in km.
Disegnare la posizione di ogni citt (plot)
Calcolare e stampare la matrice NxN delle distanze, in cui
ogni cella (i,j) rappresenta la distanza euclidea tra la citt i
e la citt j, calcolata tramite il teorema di pitagora.
Impostare a NaN la diagonale principale (in modo da non si
considerare la distanza tra una citt e stessa). Facoltativo:
visualizzare la matrice tramite il comando image.

31

Soluzione: Citt
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

N = input('Quante citt: ');


x = rand(1,N);
y = rand(1,N);
x = 100*x;
y = 100*y;
plot(x,y,'bo'); hold on
distanze = zeros(N,N);
for i1 = 1:N
for i2 = 1:N
distanzai1i2quad = (x(i1) - x(i2))^2 + (y(i1) - y(i2))^2;
distanze(i1,i2) = sqrt(distanzai1i2quad);
end
end
disp(distanze);
% Si pu fare con un ciclo for oppure con una 'matrice logica'
% for i1 = 1:N
% distanze(i1,i2) = NaN;
% end
logicaldiag = logical(eye(N));
distanze(logicaldiag) = NaN;
disp(distanze);

32

Fonti per lo studio


DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Fonti per lo studio


Introduzione alla programmazione in
MATLAB, A.Campi, E.Di Nitto, D.Loiacono,
A.Morzenti, P.Spoletini, Ed.Esculapio
Capitoli 2, 3 e 4

33