Matlab aiuto

di il
4 risposte

Matlab aiuto

Gentili utenti,
Ho un disperato bisogno di un vostro aiuto.
Non riesco a compilare una parte di uno script.Vi spiego:
Ho creato delle matrici contenenti 6 campi: attività, anno, mese, giorno, ora, residenza. Ogni matrice è riferita ad una attività di una residenza.
Da questa matrice devo ricavarne una di 0 ed 1, in cui 0 rappresenta l'assenza della attività e 1 invece la presenza.
In particolare:
Le righe dovrebbero "rappresentare" i giorni
Le colonne le ore da 0 a 23.
(Ho allegato la matrice in questione, le prime due righe della nuova matrice dovrebbero quindi essere:
000000001111001101001100
000000011010110010100100)
I ragionamenti che ho provato a fare non mi portano a nulla di concludente.
Spero davvero che qualcuno possa aiutarmi, grazie mille in anticipo.
Allegati:
Matrice
Matrice

4 Risposte

  • Re: Matlab aiuto

    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
  • Re: Matlab aiuto

    Buonasera,
    grazie per il prezioso aiuto! se invece, per non perdere informazione, volessi tener conto delle ripetizioni dei valori dovrei procedere senza usare unique nelle seguenti righe?

    % Extract the data; add 1 to avoid indices starting from 0
    x=unique(sort(k(k(:,1) == i,2)+1))
    Grazie ancora.
  • Re: Matlab aiuto

    Sì.
    Se non elimini le ripetizioni con "unique" e mantieni inalterato il resto del codice, la funzione "accumarray" conterà le ripetizioni.
    Invece di una sequenza di "0" e "1" avrai, per i valori ripetuti, la somma delle occorrenze.
    Ad esempio, la sequenza

    x=[0 2 2 5 6 9 11 12 12 12 15 18]

    darà origine alla sequenza

    M=1 0 2 0 0 1 1 0 0 1 0 1 3 0 0 1 0 0 1 0 0 0 0 0

    Nota il "2" in corrispondenza della coppia di "2" all'inizio della sequenza "x" ed il "3" in corrispondenza delle 3 ripetizioni del valore 12 in "x"
  • Re: Matlab aiuto

    Grazie mille per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
4 risposte