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,因为它在时间上变得昂贵.(我有非常大的数据集).
我想知道是否有办法在不复制"旧"数据的情况下执行此操作.谢谢.
快速实现循环缓冲区的一种方法是使用模数绕回到前面.这将稍微修改您指定的数据的顺序,但如果您只是用最新的数据替换最旧的数据,那么它可能会更快和等效,而不是
[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个位置.
归档时间: |
|
查看次数: |
3457 次 |
最近记录: |