%% Introduzione a MATLAB - parte II
%% Data exploration and cleaning

A = randn(10,10); % una matrice 10 x 10 popolata da valori estratti da una distribuzione normale
figure; imagesc(A); colormap jet % visualizzazione grafica della matrice

% Poniamo ad esempio che i valori generati corrispondono alle misure di un sensore difettoso per cui sappiamo che i valori al di sotto di 0.1 non sono affidabili:

A(A<0.1)=NaN; % tutti i valori al di sotto di 0.1 sono stati sostituiti da NaN (Not a Number)
figure; imagesc(A)

% Per individuare le coordinate di tutti gli elementi della matrice che rispettano una certa condizione logica:

[i,j]=find(A>0.5 & A<0.6) % le coordinate degli elementi di A compresi tra 0.5 e 0.6 sono memorizzati in i (righe) ed in j (colonne)

% Per creare una nuova variabile contenente i valori degli elementi che soddisfano una certa condizione logica:

x=A(A>0.7) % gli elementi di A maggiori di 0.7 sono memorizzati in x

% Per eliminare gli elementi che soddisfano una certa condizione logica:

A(A>0.8)=[] %gli elementi di A maggiori di 0.8 sono eliminati

% N.B. eliminando degli elementi la matrice perderà la sua struttura
%
%% Cicli di controllo
%
%% Ciclo for
% [Esempio giocattolo ] Somma da 1 ad n:

n=100;
s=0;
for i = 1:n
    s=s+i;      %in MATLAB non esiste il comando +=
end

disp(['la somma dei numeri da 1 a ',num2str(n),' è ' num2str(s)])

% N.B. il problema può essere risolto in due modi, entrambi più eleganti o dal punto di vista matematico o da quello numerico
% Utilizzando la funzione sum

n=100;
s=sum(1:n);

disp(['la somma dei numeri da 1 a ',num2str(n),' è ' num2str(s)])

% Utilizzando la funzione di Gauss

n=100;
s=(n*(n+1))/2;

disp(['la somma dei numeri da 1 a ',num2str(n),' è ' num2str(s)])

%% If
% [Esempio giocattolo] Stampare una stringa indicante se un numero è pari o dispari

n=17
if mod(n,2)~=0
    disp([num2str(n),' è un numero dispari'])
else
    disp([num2str(n),' è un numero pari'])
end

%% While
% [Esempio giocattolo] Approssimazione della funzione exp(x) in un punto con una certa accuratezza.
% L'approssimazione k-esima di exp(x) utilizzando lo sviluppo in serie di Taylor di exp(x) è:
%                                                                         \sum_{n=0}^k \frac{x^n }{n!}

x=0:0.1:1;
y=exp(x);

px=0.6;
py=exp(px);

figure; plot(x,y,px,py,'og')

tol=1e-5;

cnt=1;
err=1;

while err>tol % criterio d'arresto
    
    py_=1;
    
    for i=1:cnt
        
        py_=py_+(px^i/factorial(i));
            
    end
    
    cnt=cnt+1;
            err=abs(py-py_);
    
    figure(1); 
    subplot(2,1,1);
    plot(x,y,px,py,'og',px,py_,'.r','MarkerSize',10); hold on
    subplot(2,1,2)
    stem(cnt,err); hold on    
end

disp(['Per approssimare la funzione exp(x) in serie di Taylor con un tolleranza di ', num2str(tol),' sono necessari ',num2str(cnt),' termini'])

%