2016-09-25 3 views
1

Ich habe eine Matrix von Daten, wo jede Zeile mehrere Datumsangaben und eine Mitarbeiter-ID hat (und die gleichen IDs werden in verschiedenen Zeilen wiederholen). Ich muss die Zeitangaben nach Mitarbeitern auswerten, also möchte ich die relevanten Daten später zur Verarbeitung zusammentragen. Ich bin neu in Matlab und habe kein großes Gespür dafür, was das Beste dafür ist (Struct-Array, Zellen-Array, einzelne Arrays, etc.). Hinweis: Ich weiß im Voraus, wie viele Mitarbeiter ich bewerten werde, aber sie haben unterschiedliche Anzahlen von Datumsangaben, daher ist eine Matrix wahrscheinlich falsch.Matlab Newbie - vernünftige Möglichkeit, um Daten unterschiedlicher Größe zu speichern

Im Moment durchlaufe ich die Zeilen meiner Matrix und überprüfe die Benutzerspalte, und ich möchte in der Lage sein, die Datumswerte aus dieser Zeile an einem Platz für diesen Benutzer zu speichern (und anhängen, wenn dort bereits einige vorhanden sind))

data_matrix = [1,735724.291666667,735724.322916667,735724.343750000,5; 
    2,735724.331250000,735724.340277778,735724.371527778,18; 
    3,735724.402083333,735724.420833333,735724.445833333,18; 
    4,735724.411111111,735724.465277778,735724.515972222,42; 
    5,735724.412500000,735724.433333333,735724.459027778,8; 
    6,735724.425000000,735724.519444444,735724.552777778,5; 
    7,735724.431250000,735724.455555556,735724.482638889,18; 
    8,735724.438888889,735724.486805556,735724.495833333,8; 
    9,735724.531944444,735724.545138889,735724.581250000,18; 
    10,735724.547222222,735724.579861111,735724.604166667,13; 
    11,735724.549305556,735724.588194444,735724.614583333,8; 
    12,735724.563888889,735724.618055556,735724.645138889,42]; 

% we only care about IDs 1-26 
employees_to_check= 1:26 

for i= 1:length(data_matrix) 
    %employee id is the fifth element 
    this_employee = [data_matrix(i,5)]; 

    keep_record = ismember(this_row_tech, employees_to_check); 

    if keep_record 
     times_to_add = [data_matrix(i,2), data_matrix(i,3), data_matrix(i,4)] 
     % save it someplace 
    end 

end 

Was ist ein guter Ansatz zum Speichern von Daten wie diesem?

+0

Es gibt ein paar Optionen. Sie könnten eine ['table'] (https://www.mathworks.com/help/matlab/ref/table.html) mit Spalten für die ID und die' datetime' Arrays verwenden. Sie könnten einen [map container] (http://www.mathworks.com/help/matlab/map-containers.html) verwenden, wobei der Schlüssel die ID und der Wert das Array 'datetime' ist. Sie könnten ein ['struct'] (http://www.mathworks.com/help/matlab/ref/struct.html) mit [dynamic field referenzing] (http://blogs.mathworks.com/loren/2005) verwenden/12/13/use-dynamic-field-references /) aber mit streng numerischen IDs ist es nicht die beste Option. – excaza

+0

Von diesen ist "Tabelle" wahrscheinlich die beste, wenn Sie Statistiken ausführen möchten, da es Methoden zum Gruppieren und Operieren über Variablen in der Tabelle gibt. Ein Vorbehalt: Obwohl es sich seit seiner Einführung vor ein paar Jahren verbessert hat, sind die Methoden von "table" möglicherweise immer noch langsamer als der Betrieb mit den "rohen" Datenklassen. – excaza

Antwort

1

Hier ein kurzes Beispiel, wie in Ihrem Fall verwenden Tabellen:

dataTable = array2table(data_matrix,'VariableNames',... 
    {'serial','time1','time2','time3','employeeID'}); 
dataTable.time1 = datetime(datestr(dataTable.time1)); 
dataTable.time2 = datetime(datestr(dataTable.time2)); 
dataTable.time3 = datetime(datestr(dataTable.time3)); 

% we only care about IDs 1-26 
valid = dataTable.employeeID>=1 & dataTable.employeeID<=26; 
employees_to_check = dataTable(valid,:); 
times_to_add = employees_to_check{:,2:4}; 

Tisch So dataTable wie folgt aussieht:

dataTable = 
    serial   time1     time2     time3   employeeID 
    ______ ____________________ ____________________ ____________________ __________ 
    1  05-May-2014 07:00:00 05-May-2014 07:45:00 05-May-2014 08:15:00  5   
    2  05-May-2014 07:57:00 05-May-2014 08:10:00 05-May-2014 08:55:00 18   
    3  05-May-2014 09:39:00 05-May-2014 10:06:00 05-May-2014 10:42:00 18   
    4  05-May-2014 09:52:00 05-May-2014 11:10:00 05-May-2014 12:23:00 42   
    5  05-May-2014 09:54:00 05-May-2014 10:24:00 05-May-2014 11:01:00  8   
    6  05-May-2014 10:12:00 05-May-2014 12:28:00 05-May-2014 13:16:00  5   
    7  05-May-2014 10:21:00 05-May-2014 10:56:00 05-May-2014 11:35:00 18   
    8  05-May-2014 10:32:00 05-May-2014 11:41:00 05-May-2014 11:54:00  8   
    9  05-May-2014 12:46:00 05-May-2014 13:05:00 05-May-2014 13:57:00 18   
    10  05-May-2014 13:08:00 05-May-2014 13:55:00 05-May-2014 14:30:00 13   
    11  05-May-2014 13:11:00 05-May-2014 14:07:00 05-May-2014 14:45:00  8   
    12  05-May-2014 13:32:00 05-May-2014 14:50:00 05-May-2014 15:29:00 42  

und der Ausgang ist:

times_to_add = 
    05-May-2014 07:00:00 05-May-2014 07:45:00 05-May-2014 08:15:00 
    05-May-2014 07:57:00 05-May-2014 08:10:00 05-May-2014 08:55:00 
    05-May-2014 09:39:00 05-May-2014 10:06:00 05-May-2014 10:42:00 
    05-May-2014 09:54:00 05-May-2014 10:24:00 05-May-2014 11:01:00 
    05-May-2014 10:12:00 05-May-2014 12:28:00 05-May-2014 13:16:00 
    05-May-2014 10:21:00 05-May-2014 10:56:00 05-May-2014 11:35:00 
    05-May-2014 10:32:00 05-May-2014 11:41:00 05-May-2014 11:54:00 
    05-May-2014 12:46:00 05-May-2014 13:05:00 05-May-2014 13:57:00 
    05-May-2014 13:08:00 05-May-2014 13:55:00 05-May-2014 14:30:00 
    05-May-2014 13:11:00 05-May-2014 14:07:00 05-May-2014 14:45:00 
+0

Vielen Dank !!!!!!! Ich habe eine Reihe von Tischdokumentationen aus dem früheren Kommentar gesichtet und das ist eine riesige Hilfe - ich werde es jetzt versuchen! –

+0

Das war perfekt! Es ließ mich zu den lustigen Dingen übergehen (die gültigen Mitarbeiter durchgehen, ihre Zeiten überprüfen und berichten, welche die größte Voreingenommenheit haben) - Danke, dass Sie mich durch den hässlichen Teil gebracht haben! –

+0

Sie begrüßen, nur ein wenig Korrektur beachten: 'dataTable.employeeID> = 1' Ich vergaß das' = 'vorher, jetzt ist die Antwort korrigiert. – EBH

Verwandte Themen