Non è chiaro come gestire le ripetizioni dei valori (nella figura i valori della colonna "hours" alle righe 4 e 5 risultano uguali).
Assumendo che vadano trascurate (in base all'esempio della sequenza di 0 e 1, la cosa più semplice che puoi fare è:
[*] estrarre i valori delle colonne "day" e "hours"
[*] identificare i giorni per i quali si hanno i dati (il processo va poi esteso, replicandolo per i mesi) con la funzione "unique; il numero dei giorni sarà usato come limite superiore nel loop che segue
[*] all'interno di un ciclo for:
[*] identificare i valori "unici" delle ore ed ordinarli in modo crescente (funzioni "unique" e "sort"
[*] aggiungere "1" a questi valori: nel passo che segue si utilizzano questi valori come indici di un vettore. Dal momento che i dati partono da 0, aggiungere un'unità evita che si acceda all'elemento "0" di un vettore (in MatLab gli indici dei vettori partono da 1)
[*] usare la
funzione accumarray per calcolare le occorrenze dei valori delle ore identificati al punto precedente. Dal momento che i valori sono unici, la somma delle loro occorrenza sarà solo 1 se presenti, 0 in caso contrario
[*] Salvare il risultato nella matrice di output
Di seguito una possibile implementazione, basata su in data set di prova generato con numeri random.
% Define n input data set
k=[ones(9,1),randi([0 23],9,1); ones(9,1)+1,randi([0 23],9,1)]
% Identify the number of data set
n_data_set=length(unique(k(:,1)))
% Loop over the input data set
for i=1:n_data_set
% Extract the data; add 1 to avoid indices starting from 0
x=unique(sort(k(k(:,1) == i,2)+1))
% Get the max value in the data set
max_v=max(x);
% Initialize the output matrix
M=zeros(n_data_set,24);
% Identify 0s and 1s
A=accumarray(x,1)';
% Allocate the reaults to the output matrix
M(i,1:max_v)=A
end