Matlab Esercitazione 2 – Generazione di variabili Esercizio Creare una funzione che dati due vettori con le coordinate di due punti nel piano cartesiano, ne calcoli la distanza euclidea. Lanciare la funzione con i seguenti dati p1=[1 1] p2=[4,10] Date le coordinate dei vertici di un triangolo, calcolarne il perimetro. p1=[1 1] p2=[4,10] p3=[8 2] (inserire le coordinate dei punti in una matrice 3x2) Calcolare il perimetro di un pentagono con vertici p1=[2 7] p2=[3 2] p3=[6 1] p4=[8 4] p5=[5 9] Matrici “notevoli” 0 0 0 0 0 0 0 0 0 zeros (3) ones (1,3) linspace(a, b, n) n a rand (1,3) randn(1,3) 0.8147 0.9134 [1 1 1] 0.2785 distribuzione uniforme [0 1] distribuzione gaussiana a media nulla Esempio 2a: costruire una matrice con diverse distribuzioni sulle righe: X=zeros(3,100) %inizializzazione X(1, :) = rand(1,100); X(2, :) = rand(1, 100); X(3, :) = randn(1, 100) n=100; X=zeros(3,n) %inizializzazione X(1, :) = rand(1, n); X(2, :) = rand(1, n); X(3, :) = randn(1, n) b Distribuzione uniforme m rand 0 1 ab m 2 ba 12 a b rand (b a) a Esempio 3: rand 12 m 3 m=1; sigma=10; M=10000 X=rand(1,M)*(sigma*sqrt(12))+m-sigma*sqrt(3) Esempio 2b Costruire una matrice con distribuzioni uniformi con diverse medie e varianze: • riga 1: media = 1, varianza = 10; • riga 2: media = 0, varianza = 10; • riga 3: media = 2, varianza = 1; m=[1 0 2]; sigma=[10 10 1]; M=100000 X(1,:)=rand(1,M)*(sigma(1)*sqrt(12))+m(1)-sigma(1)*sqrt(3) X(2,:)=rand(1,M)*(sigma(2)*sqrt(12))+m(2)-sigma(2)*sqrt(3) X(3,:)=rand(1,M)*(sigma(3)*sqrt(12))+m(3)-sigma(3)*sqrt(3) Esempio 2c Ottimizzare il codice dell’Esercizio 2b utilizzando un ciclo for: m=[100 0 2]; sigma=[10 10 1]; M=100000; X(1,:)=rand(1,M)*(sigma(1)*sqrt(12))+m(1)-sigma(1)*sqrt(3); X(2,:)=rand(1,M)*(sigma(2)*sqrt(12))+m(2)-sigma(2)*sqrt(3); X(3,:)=rand(1,M)*(sigma(3)*sqrt(12))+m(3)-sigma(3)*sqrt(3); m=[100 0 2]; sigma=[10 10 1]; M=100000; for i = 1 : length(m) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); end Distribuzione gaussiana 0 m Esempio: m=40; sigma=10; M=10000; X=randn(1,M)*sigma+m; randn m Segnale rumoroso Esempio: Plot close all x=1:0.1:20; y=sin(x); plot(x,y); figure(); x=rand(1,100) plot(x, ’.’); y=sort(x); figure(); plot(y); figure(); plot(y, ’.’); figure(); plot(y); hold on plot(y, ’.’) subplot(1,3,1);plot(y);subplot(1,3,2);plot(y, ’.’);subplot(1,3,3); stairs(y) subplot 1 2 3 4 5 6 1 2 subplot(2,3,1);plot(a) subplot(2,3,2);plot(b) ... subplot(2,3,6);plot(f) subplot(1, 2, 1); plot(a); subplot(1, 2, 2); plot(b); hist a=rand(1,100000); hist(a,100) b=rand(1,10000); hist(a) hist(b,100) hist(a,100) a=randn(1,100000); hist(b) hist(a) Esempio 2d Visualizzare gli istogrammi delle righe della matrice dell’esempio 2c: m=[100 0 2]; sigma=[10 10 1]; M=100000; for i = 1 : length(m) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); end figure(); hist(X(1,:)); figure(); hist(X(2,:)); figure(); hist(X(3,:)); figure(); subplot(1,3,1); hist(X(1,:)); subplot(1,3,2); hist(X(2,:)); subplot(1,3,3);hist(X(3,:)); Esempio 2e Ottimizzare il codice dell’Esercizio 2d utilizzando un ciclo for: m=[100 0 2]; sigma=[10 10 1]; M=100000; for i = 1 : length(m) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); end figure(); subplot(1,3,1); hist(X(1,:)); subplot(1,3,2); hist(X(2,:)); subplot(1,3,3);hist(X(3,:)); m=[100 0 2]; sigma=[10 10 1]; M=100000; figure(); for i = 1 : length(m) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); subplot(1,3,i); hist(X(i,:)); end Esempio 2d Visualizzare gli istogrammi delle righe della matrice dell’esempio 2c: m=[100 0 2]; sigma=[10 10 1]; M=100000; for i = 1 : length(m) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); end figure(); hist(X(1,:)); figure(); hist(X(2,:)); figure(); hist(X(3,:)); figure(); subplot(1,3,1); hist(X(1,:)); subplot(1,3,2); hist(X(2,:)); subplot(1,3,3);hist(X(3,:)); Esempio 2e Ottimizzare il codice dell’Esercizio 2d utilizzando un ciclo for: m=[100 0 2]; sigma=[10 10 1]; M=100000; for i = 1 : length(m) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); end figure(); hist(X(1,:)); figure(); hist(X(2,:)); figure();hist(X(3,:)); m=[100 0 2]; sigma=[10 10 1]; M=100000; figure(); for i = 1 : length(m) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); figure(); hist(X(i,:)); end Istruzione if Esempio 5: cambiare media e varianza delle distribuzioni di MATLAB: m=[100 0 2]; sigma=[10 10 1]; M=100000; distribuzione = [‘g’ ‘g’ ‘u’]; if expression1 % is true % execute these commands elseif expression2 % is true % execute these commands else % the default % execute these commands end for i = 1 : length(m) if strcmp(distribuzione(i),‘u’) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); elseif strcmp(distribuzione(i),‘g’) X(i,:)= randn(1,M)*sigma+m; else disp(‘errore’); end figure(); hist(X(i,:)); end Esercizio Funzione per la generazione di variabili Esercizio Trasformare il codice dell’esercizio 2e in una funzione che abbia come ingressi il numero di colonne della matrice X, il vettore delle medie, il vettore delle varianze e il tipo di distribuzione. L’uscita della funzione deve essere la matrice X. Una volta creata la funzione, questa deve essere richiamata in un file esterno e deve avere come ingressi i seguenti dati: media=[15 15 100]; sigma=[1 10 10]; M=100000; distribuzione = [‘g’ ‘g’ ‘u’]; Devono poi essere visualizzati gli istogrammi delle sue righe e calcolate la media e la varianza. Definizione della funzione Vogliamo creare una funzione che abbia come ingressi: • il numero di osservazioni; • il vettore delle medie • il vettore delle deviazioni standard • il tipo di distribuzione E che abbia come unica uscita la matrice X. function [X] = generazione (M, media, sigma, distribuzione) Il codice for i = 1 : length(m) if strcmp(distribuzione(i),‘u’) X(i,:)=rand(1,M)*(sigma(i)*sqrt(12))+m(i)-sigma(i)*sqrt(3); elseif strcmp(distribuzione(i),‘g’) X(i,:)= randn(1,M)*sigma+m; else disp(‘errore’); end end Utilizzo della funzione media=[15 15 100]; sigma=[1 10 10]; M=100000; distribuzione = [‘g’ ‘g’ ‘u’]; X=generazione(M, media, sigma, distribuzione); for i = 1 : length(media) figure(); hist(X(:,i)); m_e(i) = mean(X(:,i)); s_e (i) = std(X(:,i)); end Un altro esempio (da conservare) media=[0 0 0 0]; sigma=[1 1 1 10]; M=1000000; distribuzione = [‘u’ ‘u’ ‘u’ ‘u’]; Esercizio Dato il vettore: [3 4 2 0 5 3 5 5 2 4 3 2 6 1 4 4 4 1 2 5 100] calcolarne media e mediano. Escludere l’ultimo elemento del vettore e ripetere nuovamente l’operazione. Costruire l’istogramma manualmente. (Utilizzare la funzione bar per graficarlo)