跨行或列在Matlab中存储时间序列数据是否更好?

时间:2016-05-31 17:19:37

标签: matlab data-modeling

是否存在一个建模约定,用于在行或列的每个时间步长存储一些不断变化的数据集?例如,如果我有一些10个空间点的数据集,每个时间步长x的值为t,并且我有20个时间步长,我应该将x的值存储在a的所有列中行t(制作20x10矩阵)或者我应该将x的值存储在列t的所有行中(制作10x20矩阵)?

我认识到这并没有从根本上改变任何事情,但我希望保持一致,并认为我可能会看到约定是什么,或者是否有一个约定。这两种方法的优缺点是什么。

1 个答案:

答案 0 :(得分: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版本和您的PC显而易见,但模式非常明确。

出于同样的原因,从矩阵中提取列向量比提取行向量更快。使用列时,某些内置函数的运行速度可能稍微快一些,但您需要单独分析每个案例。

所以这真的取决于你的实际代码以及你如何处理你的时间序列。您可以尝试这两个选项并对其进行分析,以查看哪种变体可以获得更好的性能。但通常,在处理时间序列数据时,您可以使用以下经验法则:

  • 如果您倾向于随着时间的推移而迭代(通常是这种情况),请将时间序列存储在不同的列中。
  • 如果您倾向于以空间/横截面方式进行迭代,请将时间序列存储在单独的行中。