2016-05-31 12 views
0

Gibt es eine Modellierungskonvention, um einen sich entwickelnden Datensatz zu jedem Zeitschritt in Zeilen oder Spalten zu speichern? Zum Beispiel, wenn ich einen Datensatz von 10 räumlichen Punkten habe, die einen Wert x zu jedem Zeitschritt t haben und ich 20 Zeitschritte habe, sollte ich die Werte von x in allen Spalten einer Reihe t speichern (eine 20x10 Matrix machend) oder sollte ich speichern der Wert x in allen Zeilen einer Spalte t (eine 10x20 Matrix machend)?Ist es besser, Zeitreihendaten in Matlab über Zeilen oder Spalten hinweg zu speichern?

Ich erkenne, dass dies nichts grundlegend ändert, aber ich möchte konsistent sein und gedacht, ich könnte sehen, was die Konvention ist, oder ob es überhaupt eine gibt. Was sind die Vor-/Nachteile für beide Ansätze?

+2

Dies ist ganz persönliche Präferenz. Einige MATLAB-Interna (z. B. "Plot") setzen voraus, dass jede Spalte eine Zeitreihe ist, dies ist jedoch keineswegs Standard. – Suever

+0

Ich mache eine Menge M & S und die Standardverwendung ist, Zeit in die erste Spalte zu setzen und die Datenpunkte in zusätzlichen Spalten aufzulisten.Es ist eine persönliche Vorliebe, aber wenn Sie Daten generieren, die viele andere Leute verwenden werden, sollten Sie Standardverwendungen in Betracht ziehen. Aber bei weitem ist die wichtigste Überlegung, alles klar zu beschriften. – gariepy

Antwort

2

Angenommen, Ihr Anliegen ist Leistung, dann hängt es davon ab, wie Sie auf Ihre Daten zugreifen. Es ist schneller, nacheinander auf Elemente zuzugreifen, die zusammenhängend im Speicher sind. Matlab stores matrices in column-major order, so z.B. Wenn Sie über die Zeitdimension iterieren müssen, ist es effizienter, über Zeilen einer bestimmten Spalte zu iterieren, als über Spalten einer bestimmten Zeile zu iterieren.

Es gibt einen schönen Artikel zu diesem Thema auf Mathworks Website - Programming Patterns: Maximizing Code Performance by Optimizing Memory Access:

Ihr Code maximale Cache-Effizienz erreicht, wenn es monoton steigende Speicherplätze durchquert. Da MATLAB Matrixspalten in monoton steigenden Speicherpositionen speichert, führt die spaltenweise Verarbeitung von Daten zu maximaler Cache-Effizienz.

Betrachten Sie dieses Beispiel. Zuerst versuchen nacheinander Zugriff auf Daten von unterschiedlichen Spalten (die über verschiedene Speicherblöcke zerstreut werden würde):

N = 2e4; 
X = randn(N,N); 
tic; 
for i = 1:N 
    for j = 1:N 
     if X(i,j) >= 0 
      X(i,j) = X(i,j) + 1; 
     end 
    end 
end 
toc; 

>> Elapsed time is 29.200216 seconds. 

Dann wird die umgekehrt - erste iterieren über Säulen, als über Zeilen:

N = 2e4; 
X = randn(N,N); 
tic; 
for j = 1:N 
    for i = 1:N 
     if X(i,j) >= 0 
      X(i,j) = X(i,j) + 1; 
     end 
    end 
end 
toc; 

>> Elapsed time is 8.084906 seconds. 

A auffällig 3,6x beschleunigen. Das genaue Verhältnis kann natürlich je nach Matlab-Version und Ihrem PC variieren, aber das Muster ist ziemlich klar.

Aus demselben Grund ist das Extrahieren eines Spaltenvektors aus einer Matrix schneller als das Extrahieren eines Zeilenvektors. Einige integrierte Funktionen können auch mit Spalten marginal schneller arbeiten, aber Sie müssen jeden Fall separat profilieren.

So hängt es wirklich von Ihrem tatsächlichen Code ab und davon, wie Sie mit Ihrer Zeitreihe umgehen. Sie können beide Optionen ausprobieren und sie profilieren, um zu sehen, welche Variante zu einer besseren Leistung führt. Aber im Allgemeinen können Sie die folgende Faustregel gelten, wenn mit Ihren Zeitreihendaten arbeiten:

  • Wenn Sie neigen dazu, im Laufe der Zeit zu durchlaufen (was meistens der Fall ist), zu speichern Zeitreihen in separaten Spalten.
  • Wenn Sie dazu neigen, in räumlicher/Querschnittsform zu iterieren, speichern Sie Zeitreihen in separaten Zeilen.
Verwandte Themen