%% TESTO
% 1) Generare un vettore denominato x di dimensione 1000x1 contenente numeri casuali dalla distribuzione normale standardizzata (assegnare il numero 1000 ad una variabile denominata n). Per replicabilità dei risultati utilizzare il seed 100
% 2) Calcolare tramite ciclo for la distribuzione di frequenza degli elementi del vettore x ottenuti utilizzando le classi (-4 -2] (- 2 0] (0 1.5] (1.5 4]
% 3) Inserire la distribuzione di frequenze in una matrice denominata Freq che contenga nella prima colonna gli estremi superiori delle classi e nella seconda colonna le frequenze associate.
% 4) Controllare che le frequenze ottenute siano le stesse che si ottengono utilizzando la funzione histogram
% 5) Formattare il risultato in una table che contenga come nomi di righe le etichette che seguono (-4 -2] (- 2 0] (0 1.5] (1.5 4]
% 6) Calcolare tramite doppio ciclo for annidato la distribuzione di frequenza utilizzando le classi di cui sopra. Suggerimento il primo ciclo for più esterno scorre sulle righe del vettore x il ciclo for più interno scorre sugli elementi del vettore che contiene gli estremi superiori delle classi
% 7) Calcolare la distribzione di frequenze in maniera vettoriale utilizzando un solo ciclo che scorre sul vettore che contiene gli estremi superiori delle classi
%% SOLUZIONE

clear
rng default
% viene fissato a 100 il seed dei numeri casuali
rng(100)
% si assegna n numeri dalla normale
n=1000;
x=randn(n,1);
classi=[-4 -2 0 1.5 4];
% Mostrare il grafico ad istogrammi utilizzando le classi
% (-4 -2]
% (- 2  0]
% (0  1.5]
% (1.5 4]

% Inizializzazione della matrice Freq
Freq=[classi(2:end)' zeros(length(classi)-1,1)];

% Calcolo delle frequenze utilizzando il ciclo for ed inserimento delle
% stesse nella seconda colonna della matrice Freq
for i=1:n
    if x(i)> -4 && x(i) <= -2
        % se x(i) è compreso tra -4 e -2 incrementa la cella Freq(1,2)
        % di un'unità
        Freq(1,2)= Freq(1,2)+1;
        
    elseif x(i)> -2 && x(i) <=0
        % se x(i) è compreso tra -2 e 0 incrementa la cella Freq(2,2)
        % di un'unità
        Freq(2,2)= Freq(2,2)+1;
        
    elseif x(i) >0 && x(i) <=1.5
        Freq(3,2)= Freq(3,2)+1;
        
    elseif x(i)> 1.5 && x(i) <4
        Freq(4,2)= Freq(4,2)+1;
    else
    end
end

% Frequenze utilizzando il ciclo for
disp('Matrice contenente la distribuzione di frequenza')
disp(Freq)

%
%% Frequenze tramite la funzione histogram
% 4) Controllare che le frequenze ottenute siano le stesse che si ottengono utilizzando la funzione histogram

disp('Frequenze tramite la funzione histogram')
h=histogram(x,classi);
disp(h.Values)

%
%% Creazione della table con le etichette di riga richieste
% 5) Formattare il risultato in una table che contenga come nomi di righe le etichette che seguono (-4 -2] (- 2 0] (0 1.5] (1.5 4]

rownam={'(-4 -2]' '(- 2  0]' '(0  1.5]' '(1.5 4]'};

Freqtable=array2table(Freq(:,2),'VariableNames',{'Distr_frequenze'}, ...
    'RowNames',rownam);
disp(Freqtable)

%
%% Creazione della distribuzione di frequenze traimite doppio ciclo for
% 6) Calcolare tramite doppio ciclo for annidato la distribuzione di frequenza utilizzando le classi di cui sopra.

classi=[-4 -2 0 1.5 4];

% Inizializzazione della matrice FreqCHK
FreqCHK=[classi(2:end)' zeros(length(classi)-1,1)];

% Calcolo delle frequenze utilizzando doppio ciclo for
for i=1:n % ciclo che scorre sugli elementi di x
    for j=1:length(classi)-1 % ciclo che scorre sugli elementi del vettore classi
        if x(i)> classi(j) && x(i) <= classi(j+1)
            % La seconda colonna della matrice FreqCHK viene aumentata di uno
            % se x(i) è compreso tra class(j) e classi(j+1) 
            FreqCHK(j,2)= FreqCHK(j,2)+1;
            % L'istruzione break serve per teminare il loop su j
            % e continuare con il loop su i. 
            % Dato che è stato trovato che classu(j) < x(i) <=classi(j+1)
            % e dato che x(i) appartiene ad una sola classe 
            % non è necessario continuare il loop (ciclo for) su j e si può
            % passare direttamente all'elemento x(i+1)
            break
        else
        end
    end
end

%
%% Risoluzione dell'esercizio in maniera vettoriale
% 7) Calcolare la distribzione di frequenze in maniera vettoriale utilizzando un solo ciclo che scorre sul vettore che contiene gli estremi superiori delle classi

% Inizializzazione della matrice FreqCHK1
FreqCHK1=[classi(2:end)' zeros(length(classi)-1,1)];
for j=1:length(classi)-1  % ciclo che scorre sugli elementi del vettore classi
    % Inserisco in posizione j gli elementi di x che sono compresi tra
    % classi(j) e classi(j+1)
       FreqCHK1(j,2)=sum( x> classi(j) & x <= classi(j+1));
end