%% Introduzione alle Variabili in MATLAB
% Table of Contents
% 1. Variabili numeriche
% 2. Operazioni tra variabili
% 3. Funzioni built-in
% 4. Variabili di testo
%% 1. Variabili numeriche
% In MATLAB il tipo di una variabile viene definito contestualmente all'assegnazione del suo valore.
% Esempio:

% Alloca la memoria per la variabile "a"
% assegnandole il valore 6
a = 6;
disp(['a = ' num2str(a)])

% In MATLAB, ogni variabile è interpretata come una matrice.
% Esempio:

% Si può vedere lo scalare "a", definito prima, come una matrice 1x1,
% per cui si può accedere all'elemento di tale matrice come:
b = a(1,1);
disp(['b = ' num2str(b)])

% Le matrici riga sono matrici con 1 riga e N colonne, e si definisco immettendo gli N numeri separati da spazio, dentro parentesi quadre.
% Esempio:

% Alloca la variabile "r" come matrice riga di 4 elementi
r = [1.0 4.3 0.4 -2.0];
disp(['r = [' num2str(r) ']'])

% Le matrici colonna, invece, sono costituite da una colonna e N righe; si definiscono immettendo i numeri tra parentesi quadre separati da "punto e virgola".
% Esempio:

% Alloca la variabile "c" come matrice colonna di 4 elementi
c = [1.0; 4.3; 0.4; -2.0];
disp('c = '); disp(c);

% Le matrici hanno N righe e M colonne, e si definiscono scrivendo tra parentesi quadre le righe separate da "punto e virgola".
% Esempio:

% Alloca la variabile "A" come matrice di 2 righe e 3 colonne 
A = [-1.0 1.0 2.4; 2.3 -0.4 9.9];
disp('A = '); disp(A)

% Per accedere ad un elemento di una matrice si scrive il nome della variabile seguito da parentesi tonde nelle quali, separati da virgola, vanno indicati l'indice di riga e quello di colonna. Tali indici vanno da 1 al numero di righe/colonne.
% Esempio:

% Si assegna alla variabile "a" l'elemento della matrice A
% nella seconda colonna della prima riga
a = A(1,2);
disp(['A(1,2) = ' num2str(a)])

% La stessa scrittura si può utilizzare per accedere in scrittura agli elementi della matrice.
% Esempio:

% Modificare l'elemento della terza colonna della seconda riga
% da 9.9 a -8.0:
A(2,3) = -8.0;
disp('Matrice modificata'); disp(' '); disp('A = '); disp(A)

% Si può accedere ad una porzione della matrice usando l'operatore che serve a definire gli intervalli, ossia "due punti". Inserire ":" al posto dell'inidice di riga (o di colonna) significa prendere tutta la riga (o tutta la colonna). Alternativamente, al posto dell'indice di riga (o di colonna) indicare due numeri separati dai ":" significa prendere una porzione di riga (o di colonna) inclusa tra i due numeri.
% Esempio:

% Copiare nella variabilw "B" la parte di matrice "A" che prenda
% tutte le righe, ma solo le prime due colonne
B = A(:,1:2);
disp('B = '); disp(B)

%% 2. Operazioni tra variabili
% Quando si effettua un'operazione tra due variabili, il MATLAB riconosce se sono scalari o matrici. Nel secondo caso, applica le regole delle matrici per svolgere l'operazione richiesta.
% Esempio:

% Decommentare il comando seguente ed eseguire questa cella. Il MATLAB darà
% errore perché la somma tra matrici che hanno dimensioni differenti
% non è definita. Per proseguire, commentare nuovamente il comando.

%s = A + r

% Attenzione, però, alle operazioni tra matrici riga e matrici colonna: il MATLAB può interpretare la moltiplicazione e la somma intese come diadiche.
% Esempio:

% "r" è una matrice riga di 4 elementi, mentre "c" è una matrice colonna
% di 4 elementi. Moltiplicando r per c, il MATLAB applica la regola di
% moltiplicazione tra matrici, essendo "r" e "c" di dimensioni compatibili

prc = r * c;
disp(['prc = ' num2str(prc)])

% Scambiado l'ordine di moltiplicazione, però, essendo le matrici colonna
% e riga, il MATLAB interpreta tale prodotto come diadico

pcr = c * r;
disp(['pcr =']); disp(pcr)

%% 3. Funzioni built-in
% Può tornare utile conoscere che esistono le funzioni: max, min, sum, mean, e std che calcolano (per colonna, a meno che non siano applicate a una matrice riga), rispettivamente, il massimo, il minimo, la somma, la media e la deviazione standard di ogni colonna della matrice data in ingresso.
% Esempi:

% Le righe seguenti mostrano l'effetto delle funzioni sopra riportate
% sulla matrice A. L'operazione viene eseguita per ogni colonna.

disp('A = '); disp(A)
ma = max(A);
disp('max(A) = '); disp(ma)
mi = min(A);
disp('min(A) = '); disp(mi)
s = sum(A);
disp('sum(A) = '); disp(s)
m = mean(A);
disp('mean(A) = '); disp(m)
sigma = std(A);
disp('std(A) = '); disp(sigma)

% Si può trasporre una matrice con la funzione transpose.
% Esempio:

disp('A = '); disp(A)
At = transpose(A);
disp('A^tr = '); disp(At)

% Si può calcolare l'aggiunta di una matrice con l'uso dell'apice "'"

% Alloca una matrice complessa (1j è l'unità complessa i)
B = [1j, 3-1j*2; 1-1j 4];
disp('B = '); disp(B)
% Calcola l'aggiunta di B
Badj = B';
disp('B'' = '); disp(Badj)

%% 4. Variabili di testo
% Una variabile di testo viene definita se il valore assegnatole è incluso tra apici.
% Esempio:

t = 't è variabile di testo';
disp(t)

% Si possono convertire le variabili numeriche in testo e viceversa.
% Esempi:

% num2str() è una funzione che converte un numero in testo
a = 1.5;
ta = num2str(a);
disp(['a = ' ta])
% str2num() è una funzione che converte un testo in numero
t = '2.0';
b = str2num(t);
c = 2 * b;
disp(['Il doppio di t vale ' num2str(c)])