2016-05-31 28 views
0

是否有建模慣例在行或列中的每個時間步中存儲一些正在發展的數據集?例如,如果我有10個空間點的數據集,每個時間步的值爲x,並且我有20個時間步,我應該在行的所有列中存儲x的值t(製作20x10矩陣),或者我應該存儲在列t(製作10x20矩陣)的所有行中的值爲x將時間序列數據存儲在Matlab中跨越行或列更好嗎?

我意識到這並不會從根本上改變任何事情,但我想要保持一致,並且認爲我可以看到約定是什麼,或者如果有的話。這兩種方法有哪些優缺點。

+2

這完全是個人偏好。一些MATLAB內部函數(比如'plot')假設每一列都是時間序列,但這絕不是標準的。 – Suever

+0

我做了很多M&S,標準的用法是把時間放在第一列中,並將數據點列在其他列中。這是個人偏好,但如果您正在生成許多其他人將要使用的數據,則考慮標準用法是明智的。但是,最重要的考慮因素是CLEARLY LABEL。 – gariepy

回答

2

假設你關心的是性能,那麼這取決於你如何訪問你的數據。連續訪問內存中連續的元素會更快。 Matlab stores matrices in column-major order,例如如果您需要迭代時間維,則迭代特定列的行比遍歷特定行的列更有效。

有上Mathworks公司網站這個話題好文章 - Programming Patterns: Maximizing Code Performance by Optimizing Memory Access

您的代碼實現了最大的緩存效率,當它穿越 單調遞增的存儲位置。由於MATLAB將 矩陣列存儲在單調遞增的內存位置中,因此按列處理數據會產生最大的緩存效率。

考慮這個例子。首先,嘗試從不同的列連續存取數據(這將是分散在不同的存儲塊):

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. 

然後周圍的其他方法 - 在列的第一迭代,較比行:

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. 

醒目的3.6x加速。確切的比例可能會明顯不同,取決於Matlab的版本和你的電腦,但是模式非常清晰。

出於同樣的原因,從矩陣中提取列向量比提取行向量要快。某些內置函數對於列的處理速度可能稍快一些,但您需要分別對每個案例進行分析。

所以它真的取決於您的實際代碼以及您如何處理時間序列。您可以嘗試兩種選項並對其進行配置,以查看哪種變體可以獲得更好的性能。在單獨列

  • 如果你傾向於遍歷時間(這是一般的情況),存儲時間序列:但一般來說,你可以用你的時間序列數據時使用拇指以下規則。
  • 如果您傾向於以空間/橫截面方式迭代,請將時間序列存儲在單獨的行中。
相關問題