这里有一些很好的帖子(例如this one)了解如何在 MATLAB 中创建循环缓冲区。然而,从观察它们来看,我认为它们不适合我的应用程序,因为我正在寻找的是 MATLAB 中的循环缓冲区解决方案,它不涉及任何旧数据的复制。
举一个简单的例子,假设我一次处理 50 个样本,每次迭代读取 10 个样本。我将首先运行 5 次迭代,填充缓冲区,最后处理 50 个样本。所以我的缓冲区将是
[B1 B2 B3 B4 B5]
,其中每个“B”是 10 个样本的块。
现在,我读入接下来的 10 个样本,将它们称为 B6。我希望我的缓冲区现在看起来像:
[B2 B3 B4 B5 B6]
问题是 - 我不想每次都复制旧数据 B2、B3、B4、B5,因为它会在时间上变得昂贵。 (我有非常大的数据集)。
我想知道是否有一种方法可以在不复制“旧”数据的情况下执行此操作。谢谢。
快速实现循环缓冲区的一种方法是使用模数从回绕到前面。这将稍微修改您指定的数据顺序,但如果您只是用最新数据替换最旧的数据,而不是使用最新的数据,则可能会更快且等效
[B2 B3 B4 B5 B6]
You get
[B6 B2 B3 B4 B5]
通过使用这样的代码:
bufferSize = 5;
data = nan(bufferSize,1)';
for ind = 1:bufferSize+2
data(mod(ind-1, bufferSize)+1) = ind
end
这适用于任意大小的数据。
如果您不熟悉模数,mod
函数有效地返回除法运算的余数。所以mod(3,5)
returns3
, mod(6,5)
回报1
, mod(7,5)
回报2
依此类推,直到达到mod(10,5)
又等于 0。这使我们能够通过每次到达终点时移回起点来“环绕”向量。这+1
and -1
代码中的原因是因为 MATLAB 从 1 而不是 0 开始其向量索引,因此为了正确计算数学结果,您必须在执行以下操作之前删除 1mod
然后将其添加回来以获得正确的索引。结果是,当您尝试将第六个元素写入向量时,会将其写入向量中的第一个位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)