是否存在一个建模约定,用于在行或列的每个时间步长存储一些不断变化的数据集?例如,如果我有一些10个空间点的数据集,每个时间步长x
的值为t
,并且我有20个时间步长,我应该将x
的值存储在a的所有列中行t
(制作20x10矩阵)或者我应该将x
的值存储在列t
的所有行中(制作10x20矩阵)?
我认识到这并没有从根本上改变任何事情,但我希望保持一致,并认为我可能会看到约定是什么,或者是否有一个约定。这两种方法的优缺点是什么。
答案 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显而易见,但模式非常明确。
出于同样的原因,从矩阵中提取列向量比提取行向量更快。使用列时,某些内置函数的运行速度可能稍微快一些,但您需要单独分析每个案例。
所以这真的取决于你的实际代码以及你如何处理你的时间序列。您可以尝试这两个选项并对其进行分析,以查看哪种变体可以获得更好的性能。但通常,在处理时间序列数据时,您可以使用以下经验法则: