%% Esercitazioni basate sul Tutorial Matlab di Davide Manca - PoliMI
%
%% Slide da 1 a 6 - Matrici e vettori

% definizione di una matrice
A = [1, 2, 3; 4, 5, 6; 7, 8, 9]

% cancellare una variabile
clear A % pulisce la variabile A

% definizione di vettori e prodotti matriciali
b = [1, 10, 20]; % il simbolo ";" non visualizza il risultato dell'espressione
c = b'      % definisce c come la trasposta di b
d = c * b   % prodptto righe per colonna
e = b * c   % prodotto righe per colonna
f = b .* c' % prodotto elemento per elemento

%per ottenere una mappa colorata di una matrice usare image
figure % apre una nuova figura
image(d)
% è possibile utilizzare image per plottare colori in coordinate RGB (vedi help)

% per ottenere, invece, una superficie colorata, si utilizza surf
surf(d)

% aggiungendo cameratoolbar è possibile ruotare l'immagine con il mouse
surf(d)
cameratoolbar

% per suonare un vettore si utilizza sound
sound(rand(10000,1))

clear       

%
%% Slide 7 - Altri comandi Matlab

clc  % cancella il contenuto della finestra di comando
who  % genera una lista delle variabili
whos % come il precedente, con indicazione della tipologia delle variabili
x = 0.1 : 0.2 : 1. % definizione di un vettore da 0.1 a 1.0 con
                   % incrementi di 0.2
y = 0 : 2 : 10 % definizione di un vettore da 0 a 10 con incrementi di 2
z = 0 : 3 : 10 % definizione di un vettore da 0 a 10 con incrementi di 3
              % (arriva fino a 9)
clear

%
%% Memorizzare una stringa

variabile = 'valore stringa da memorizzare' % si assegna la stringa alla variabile
disp(variabile)
clear variabile

% per convertire un numero in una stringa
xNum = pi;
xString = num2str(xNum); disp(xString)

xString = num2str(xNum,'%12.9f'); % per specificare il formato e il numero di cifre
disp(xString)

%
%% Slide da 8 a 12 e 32 - Diagrammi

% HELP: per visualizzare l'help relativo a un comando, digitare:
% help comando
% es. per visualizzare l'help del comando plot, scrivere:
help plot

% GRAFICI
x = [5, 9, 10];
y = [6, 3, 8];
plot(x,y,'r-o') % plotta i valori di "y" rispetto a "x"
                % r: red
                % -: linea continua
                % o: pallini
hold on   % riferisce i comandi seguenti al grafico attivo 
grid
xlabel('ascissa')  % N.B. per inserire caratteri speciali (es. lettere
ylabel('ordinata') % greche) utilizzare i comandiLlatex
title('titolo del grafico')
legend('grafico')
hold off
% le precedenti opzioni possono anche essere specificate nella stessa riga
% di comando
plot(x,y,'r-o'),grid,xlabel('ascissa'),ylabel('ordinata'),title('titolo del grafico')

fplot('tanh',[-2,2]) % plotta la funzione tanh(x) per -2<x<2
% fplot plotta anche una function handle come segue
fh = @tanh; % definisce fh come @tanh
fplot(fh,[-2,2])

% per disegnare più diagrammi in un'unica finestra
figure % questo comando apre una nuova figura, non necessario in questo caso
subplot(1,2,1) % array 1x2, posto 1
plot(x,y,'r-o'),grid,xlabel('ascissa'),ylabel('ordinata'),title('titolo del grafico')
subplot(1,2,2)
fplot(fh,[-2,2])

clear

%
%% Definizione di funzioni

% nel precedente caso, tanh è una funzione già definita in Matlab.
% Si possono definire anche altre funzioni alle quali "puntare" con "@"
% Nell'esempio che segue si punta alla funzione fprova
% definita in un file esterno
fh = @fprova;
fplot(fh,[-2,2])
clear

% Si può anche puntare a una funzione vettoriale come segue
fh = @fprovavett;
fplot(fh,[-2,2])
clear

% Oppure si possono utilizzare le "Anonymous functions":
% non salvate in un file a parte
% possono contenere un singolo "comando"
fh = @(x) sqrt(abs(x));
fplot(fh,[-2,2])
% la "Anonymous functions" può essere "chiamata" come una qualunque altra
fh(0)
fh(10)
fh([1:1:10])
clear
% le "Anonymous functions" possono essere anche funzioni vettoriali di più
% variabili
fh = @(x,y) [x^2+y, y-1];
fh(1,1)
clear

%
%% Slide 13 - Variabili e funzioni predefinite

i, j    % unità immaginaria
pi      % pigreco
Inf     % infinito (ad es.: 3/0)
NaN     % not a number(ases.: 0/0, Inf/Inf)
a = pi; b=(-pi);
sin(a), cos(a), tan(a), asin(a), acos(a)   % funzioni trigonometriche e inverse (in radianti)
sinh(a), cosh(a), asinh(a), acosh(a)    % funzioni iperboliche e loro inverse
sqrt(a), log(a), log10(a), exp(a)       % funzioni varie
rem(a,b)     % resto della divisione intera (segno del numeratore)
mod(a,b)     % resto della divisione intera (segno del denominatore)

%
%% Slide 14 e 15 - Costrutti, operatori logici e di confronto

% if
% for
% while
% switch - case

% OPERATORI DI CONFRONTO
% < <= > >= == ~=

% OPERATORI LOGICI
% ~ [NOT], && [AND], || [OR]

%
%% Slide 16 e 17 - Output formattato su video o su file

disp('testo da visualizzare')

% fprintf per SCRITTURA A VIDEO
fprintf('Pigreco = %g ',pi)    % %g formato floating point compatto

fprintf('Pigreco= %15.2f ',pi) % notazione a punto fisso %CifreTotali.CifreDecimali
fprintf('Pigreco= %15.8f ',pi)
fprintf('Pigreco= %20.8f ',pi)

fprintf('Pigreco= %15.2e ',pi) % notazione esponenziale %CifreTotali.CifreDecimali
fprintf('Pigreco= %15.8e ',pi)

% nel caso in cui si volessero scrivere, ripetendo la formattazione, i valori contenuti in un array
prova = [1.0, 2.0, 3.0, 4.0];
fprintf('valore = %15.2f ',prova)   % in questo modo scrive sulla stessa riga
fprintf('valore = %15.2f \n',prova) % in questo modo va a capo (si usa \n)

% se si vogliono scrivere più valori sulla stessa riga
fprintf('primo valore = %5.2f secondo valore = %5.2f \n',prova)

%fprintf per SCRITTURA SU FILE
unit = fopen('FileProva.txt','w'); % apre FileProva.txt in scrittura sovrascrivendo il contenuto esistente
                                   % per scrivere e "appendere" all'esistente usare 'a'
fprintf(unit,'primo valore = %5.2f secondo valore = %5.2f \n',prova);
fclose(unit);

% vedere anche fwrite, fread, save, load
clear

%
%% Slide 20 - HT1
% Come produrre dei punti equidistanti secondo n intervalli comprendendogli estremi

%input
xLow    = 1.0;
xUp     = 10.0;
nInterv = 9;

%costruzione
Incr = (xUp - xLow) / nInterv;
for ii = 1 : (nInterv+1)
    x(ii) = xLow + Incr * (ii-1);
end
x
clear

%
%% Prova
% simulare il comando x = [1:3:11] che costruisce un array di valori che comprendono il primo estremo, li altri cono ottenuti per incrementi di 3 e l'ultimo valore è minore io uguale a 11

%input
xLow = 1.0;
xUp  = 11.0;
Incr = 2;

%costruzione
ii = 0;
valore = xLow;
while valore <= xUp % while continua a eseguire finché
                    % la condizione, verificata a
                    % inizio ciclo, è vera
    ii = ii + 1;
    valore = xLow + Incr * (ii-1);
    if valore <= xUp
        x(ii) = xLow + Incr * (ii-1);
    end
end
x
clear

%
%% Slide da 25 a 28 - varie su matrici

A = zeros(3,5) % crea una matrice di zeri di 3 righe e 5 colonne
size(A) % restituisce la lunghezza di ognuna delle dimensioni di A
        % size(A,1) restituisce solo il n. di righe
length(A) % restituisce il massimo tra le lunghezze delle dimensioni di A
length(size(A)) % numero di dimensioni della matrice

B = rand(4)   % crea una matrice 4x4 di numeri random tra 0. e 1.
C = rand(3,5) % crea una matrice 3x5 di numeri random tra 0. e 1.

diag(B)    % estrae la diagonale principale i B
diag(C)    % estrae gli elementi di posto i,i di C
diag(B,1)  % estrae gli elementi di posto i,i+1 di B
diag(B,-1) % estrae gli elementi di posto i,i+1 di B
diag([1,2,3,4])   % crea una matrice diagonale
diag([1,2,3,4],1) % crea una matrice diagonale

det(B)   % calcola il determinante di B
trace(B) % calcola la traccia di B

sum(C)   % restituisce una riga contenente la somma delle colonne di C
sum(C,1) % come sopra
sum(C,2) % restituisce una colonna contenente la somma delle righe di C

v = rand(4,1);
sum(v)   % somma gli elementi di v
prod(v)  % moltiplica gli elementi di v
clear

%
%% Slide 33 - HT 12
% determinare la parte intera di un numero a virgola mobile

x = [-5.8, -3.2, -2.5, 0., 0.5, 2.1, 3.9];
fix(x)
round(x)
floor(x)
ceil(x)

%
%% Varie, utili

which ceil % restituisce il percorso della directory
           % che contiene la funzione ceil

% N.B. per TERMINARE una sessione, una funzione, etc. utilizzare uno dei seguenti:
% exit
% error
% quit
% etc.

% per SOSPENDERE l'esecuzione di un programma usare pause
% pause    % sospende l'esecuzione
% pause(2) % sospende l'esecuzione per 2 secondi

%
% Slide 54 - HT 32

% per cronometrare il tempo di una sequenza di istruzioni
tic
A = rand(2000);
b = rand(2000,1);
x = A \ b;
toc

% per una misura più precisa utilizzare cputime
t1 = cputime;
A = rand(2000);
b = rand(2000,1);
x = A \ b;
Dt = cputime - t1;
fprintf('intervallo di tempo = %15.10f %s',Dt,' secondi')

clear