%% Testo
% 1) Caricare in formato table (con i nomi delle righe) i dati presenti nel file di Excel Indicatori_economici.xlsx
% 2) Calcolare le medie ponderate degli indicatori (utilizzando come peso la variabile addetti) tramite operazioni matriciali, funzioni bsxfun e ciclo for
% 3) Calcolare gli scostamenti quadratici medi ponderati utilizzando operazioni matriciali e ciclo for
% 4) Mostrare i risulati utilizzando le table
%% Soluzione

% Leggi il file in formato table (la prima colonna contiene i nomi delle
% righe) e la prima riga i nomi delle variabili.
% Osservazione: non è necessario specificare 'ReadVariableNames',true
% poiché questo è già il default. Al contrario il default di ReadRowNames è
% false di conseguenza è necessario settarlo a true
X=readtable('Indicatori_economici.xlsx','ReadRowNames',...
    true,'ReadVariableNames',true);

Xdouble=table2array(X(:,2:end));
w=table2array(X(:,1));

% Calcolo delle medie ponderate
meanweighted=sum(Xdouble.*w)/sum(w);

% Nelle versioni vecchie di MATALB l'operazione di moltiplicazione di una
% matrice (n-by-p) * (n-by-1) produce un errore ed era necessario
% utilizzare la funzione bsxfun come segue oppure un ciclo for
meanweightedCHK=sum(bsxfun(@times,Xdouble,w))/sum(w);


% Istruzione alternativa basata su ciclo for per creare la matrice che
% contiene i valori originari moltiplicati per i pesi
[n,p]=size(Xdouble);
Xw=zeros(n,p);
for j=1:p
    Xw(:,j)=Xdouble(:,j).*w;
end

% Calcolare gli scostamenti quadratici medi ponderati 
stdweighted=sqrt(sum(((Xdouble-meanweighted).^2).*w)/sum(w));


% Istruzione alternativa basata su ciclo for per creare le varianze
% ponderate
[n,p]=size(Xdouble);
stdweightedCHK=zeros(1,p);
for j=1:p
    mediaj=sum(Xdouble(:,j).*w)/sum(w);
   stdweightedCHK(j)=sqrt(sum(((Xdouble(:,j)-mediaj).^2).*w)/sum(w));
end

%
%% Display results
% Mostro i risulati utilizzando le table

disp('Medie ponderate')
array2table(meanweighted,'VariableNames',X.Properties.VariableNames(2:6))

disp('Standard deviation ponderate')
array2table(stdweighted,'VariableNames',X.Properties.VariableNames(2:6))