Somma di valori sotto condizione

di il
4 risposte

Somma di valori sotto condizione

Buongiorno a tutti,

ho la necessità di elaborare una matrice di dati m di 16 colonne per oltre 3 milioni di righe.
Quello che vorrei dire a Matlab di fare é di sommarmi i valori della colonna 8 fintanto che sono uguali i valori delle righe della colonna 1 ( che sono per esempio 10 righe uguali tra loro, altre 20 uguali tra loro e così via...) e quando questi non sono più uguali di andare avanti con le altre righe...
Volevo farlo usando un ciclo for più un while o un if.. però non riesco in nessun modo. Qualcuno ha quanche idea ?
Grazie anticipatamente.

4 Risposte

  • Re: Somma di valori sotto condizione

    Se pubblichi il codice che hai scritto, si possono individuare gli errori e proporti una soluzione.

    Dovresti anche aggiungere qualche dettaglio sui numeri nella colonna 1:
    [*] di che tipo sono (interi, float, date,...)
    [*] le sequenze di ripetizioni si possono ripetere? Nell'esempio che hai fatto ("er esempio 10 righe uguali tra loro, altre 20 uguali tra loro e così via...") la prima sequenza può ripetersi nelle righe successive, ad esempio la prima sequenza può ripetersi dalla riga 1001 alla riga 1010?
    Se sì, i corrispondenti valori della colonna 8 vanno aggiunti alla somma precedente?
    Meglio sarebbe se pubblicassi un esempio della matrice di dati, non tutti i 3 milioni di righe, ma una selezione ragionevole che dia l'idea di come delle varie (2, 3) sequenze di dati.
  • Re: Somma di valori sotto condizione

    Ciao, grazie per la risposta.
    La matrice a cui mi riferisco ( "d" ) é quella nella prima immagine. La prima colonna é costituita da data e ora ("numutc"), l'ottava da dati di flusso ("flow"). Io voglio sommare i flussi riferiti alla stessa data e ora (data e ora sono uguali per un po' di righe e poi cambiano).
    Ho abbozzato un codice , ma non sono esperta di matlab. Qualunque consiglio é ben accetto... Grazie!
    Allegati:
    28595_b07ff4a10b68648bc4ecfc4fc3bbd4be.png
    28595_b07ff4a10b68648bc4ecfc4fc3bbd4be.png

    28595_25dd0da402ca28ce3781f1a01c18588f.jpg
    28595_25dd0da402ca28ce3781f1a01c18588f.jpg
  • Re: Somma di valori sotto condizione

    Ci sono almeno tre errori concettuali nel loop che hai scritto:
    [*] uso dell funzione "sum": ad ogni iterazione passi alla funzione un solo valore, flow(i) o flow(i+1). La funzione richiede un set di valori.
    [*] a prescindere dall'errore precedente, la variabile alla quale assegni il valore della somma è a stessa che contiene i valori di input (flow). Questo comporta che nella prima iterazione, il vettore "flow" viene convertito in una variabile scalare. Nella seconda iterazione dovresti ricevere un messaggio di errore in quanto tenti di accedere ad una variabile scalare, come ad un vettore (es. flow(i))
    [*] a prescindere dagli errori precedenti, assegni il valore della somma sempre alla stessa variabile scalare, questo fa sì che, ad ogni iterazione il valore della somma calcolata in quella precedente venga sovrascritto

    La cosa più semplice che puoi fare è:
    [*] convertire le date nei corrispondenti "serial numbers" con la funzione "datenum"
    [*] usare la funzione "unique" per trovave il set di date uniche
    [*] impostare un loop che identifichi i vari set di date
    [*] calcolare le somme dei corrispondenti valori

    Questo approccio comporta un rischio in quanto confronti tra loro valori di tipo double (le date convertite in serial numbers) per verificare se siano uguali; ci potrebbero essere degli "rounding errors" che potrebbero portare a risultati non corretti.

    Possibili soluzioni potrebbero essere cercare le occorrenze delle delle date (in forma di stringa) all'interno del set di date oppure convertire le date in vettori numerici con la funzione "datevec"; in questo caso dovresti estendere la ricerca delle dei set di date uguali alle singole componenti dei vettori.

    Di seguito un esempio di implementazione del primo metodo.
    Attenzione verifica la correttezza dei risultati.
    
    t=[
    '2020-01-21 06:10:00'
    '2020-01-21 06:10:00'
    '2020-01-21 06:11:00'
    '2020-01-21 06:11:00'
    '2020-01-21 06:12:00'
    '2020-01-21 06:12:00'
    '2020-01-22 06:11:00'
    '2020-01-22 06:11:00'
    '2020-02-21 06:11:00'
    '2020-02-21 06:11:00'
    ]
    
    % Define the example input val
    m=randi([1 10],10,1)
    % Convert date to serial number
    dn=datenum(t);
    % Get the unique dates
    [ud,b,~]=unique(dn)
    % Get the number of unique dates
    n_unique=length(ud);
    % Initialize output arrays
    sum_val=nan(n_unique,1);
    sum_date=char(zeros(n_unique,size(t,2)))
    % Loop over the unique dates
    for i=1:n_unique
        % Sum the values for the unique date
        sum_val(i)=sum(m(find(dn == ud(i))));
        % Strore the unique date
        sum_date(i,:)=t(b(i),:);
    end
    
    sum_val
    sum_date
    
  • Re: Somma di valori sotto condizione

    Grazie per la risposta. Ragionerò sia su quello che hai detto che sull'esempio di codice che mi hai fornito.
Devi accedere o registrarti per scrivere nel forum
4 risposte