这里有一些关于如何在 MATLAB 中制作循环缓冲区的好帖子(例如 this one )。但是,从查看它们的角度来看,我不相信它们适合我的应用程序,因为我正在寻找的是 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]

你得到
[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) 返回 3mod(6,5) 返回 1mod(7,5) 返回 2 ,依此类推,直到您再次到达 mod(10,5) 等于 0 。这使我们能够通过每次到达终点时移回起点来“环绕”向量。代码中的 +1-1 是因为 MATLAB 从 1 而不是 0 开始其向量索引,因此为了使数学正确计算,您必须在执行 mod 之前删除 1,然后将其重新添加以获得正确的索引。结果是,当您尝试将第 6 个元素写入向量时,将其写入向量中的第一个位置。

关于matlab - MATLAB 中的循环缓冲区,**不**复制旧数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20890128/

10-12 16:29
查看更多