MATLAB中的循环缓冲区,**无**复制旧数据

Spa*_*cey 4 optimization matlab buffer circular-buffer processing-efficiency

关于如何在MATLAB中创建循环缓冲区,这里有一些好的帖子(比如这篇).然而,通过查看它们,我不相信它们适合我的应用程序,因为我所寻求的是MATLAB中的循环缓冲解决方案,它不涉及任何旧数据的复制.

举一个简单的例子,我们说我一次处理50个样本,每次迭代读取10个样本.我将首先完成5次迭代,填充我的缓冲区,最后处理我的50个样本.所以我的缓冲区将是

[B1 B2 B3 B4 B5]
Run Code Online (Sandbox Code Playgroud)

,其中每个'B'是10个样本的块.

现在,我在接下来的10个样本中读到,称之为B6.我希望我的缓冲区现在看起来像:

[B2 B3 B4 B5 B6]
Run Code Online (Sandbox Code Playgroud)

问题就是这样 - 我不想每次都复制旧数据,B2,B3,B4,B5,因为它在时间上变得昂贵.(我有非常大的数据集).

我想知道是否有办法在不复制"旧"数据的情况下执行此操作.谢谢.

Ste*_*eve 5

快速实现循环缓冲区的一种方法是使用模数绕回到前面.这将稍微修改您指定的数据的顺序,但如果您只是用最新的数据替换最旧的数据,那么它可能会更快和等效,而不是

[B2 B3 B4 B5 B6]
Run Code Online (Sandbox Code Playgroud)

你得到

[B6 B2 B3 B4 B5]
Run Code Online (Sandbox Code Playgroud)

通过使用这样的代码:

bufferSize = 5;

data = nan(bufferSize,1)';

for ind = 1:bufferSize+2  

    data(mod(ind-1, bufferSize)+1) = ind

end
Run Code Online (Sandbox Code Playgroud)

这适用于任意大小的数据.

如果您不熟悉模数,则该mod函数有效地返回除法运算的剩余部分.所以mod(3,5)返回3,mod(6,5)返回1,mod(7,5)返回2等等,直到你mod(10,5)再次达到等于0.这允许我们通过在每次到达结束时回到起点来"环绕"向量.在+1-1代码是因为MATLAB在1,而不是0开始它的矢量指数因此获得数学得以顺利实施,你必须在做之前删除1 mod,然后重新添加它得到正确的指标.结果是当你尝试将第6个元素写入向量时,将其写入向量中的第1个位置.

  • @bjoern在进一步检查下面的代码后,它们是相似的.但是,`mod`命令可能更快并且更紧凑.此外,此方法显式使用数组而不是单元数组.这意味着您不必修改现有代码或调用`cell2mat`或等效的 - 这将需要不合需要的复制操作. (2认同)