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.
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
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