如何在MATLAB中创建循环缓冲区,以便以正确的顺序进行连续测量

时间:2009-09-28 10:55:26

标签: matlab

我读了:How to create a buffer matrix in MATLAB for continuous measurements?,问题。我想知道是否有可能按顺序存储值而不是像问题那样反向存储值,而不是在每次迭代后使用fliplr(从左向右翻转)?

4 个答案:

答案 0 :(得分:4)

从前到后:

buffSize = 10;
circBuff = nan(1,buffSize);
for newest = 1:1000;
    circBuff = [circBuff(2:end) newest]
end

circBuff =          991 992 993 994 995 996 997 998 999 1000

回到前面:

buffSize = 10;
circBuff = nan(1,buffSize);
for newest = 1:1000;
    circBuff = [newest circBuff(1:end-1)]
end

circBuff =         1000 999 998 997 996 995 994 993 992 991

答案 1 :(得分:1)

buffSize = 10;
circBuff = nan(1,buffSize);
for newest = 1:1000;
    circBuff = [circBuff(2:end), newest]
   %circBuff = [newest circBuff(1:end-1)] %reverse direction

end

我已经测试了这个,在MATLAB中运行没有多少时间。分析器没有找到代码的任何瓶颈。

答案 2 :(得分:1)

我刚刚将我的解决方案上传到快速循环缓冲区

http://www.mathworks.com/matlabcentral/fileexchange/47025-circvbuf-m

这种循环缓冲区的主要思想是持续快速的性能 在程序中使用缓冲区时避免复制操作:

% create a circular vector buffer
    bufferSz = 1000;
    vectorLen= 7;
    cvbuf = circVBuf(int64(bufferSz),int64(vectorLen));

% fill buffer with 99 vectors
    vecs = zeros(99,vectorLen,'double');
    cvbuf.append(vecs);

% loop over lastly appended vectors of the circVBuf:
    new = cvbuf.new;
    lst = cvbuf.lst;
    for ix=new:lst
       vec(:) = cvbuf.raw(:,ix);
    end

% or direct array operation on lastly appended vectors in the buffer (no copy => fast)
    new = cvbuf.new;
    lst = cvbuf.lst;
    mean = mean(cvbuf.raw(3:7,new:lst));

检查截图,看看如果缓冲区很大,这个循环缓冲区有优势,但每次附加的数据大小很小,因为circVBuf的性能不依赖于缓冲区大小,与简单的副本相比缓冲液中。

双缓冲可以根据要在任何情况下附加的数据来确定追加的预测时间。将来这个课程会给你一个双重缓冲的选择是或否 - 如果你不需要保证时间,事情就会加速。 speedtest

答案 3 :(得分:0)

对于任何想要创建缓冲区“Matrix”而不是数组(nx1或1xn矩阵)的人,可以将代码修改为:

buffSize = 10;
 circBuff = nan(3,buffSize);
 for newest = 1:1000;
 circBuff = [circBuff(1,2:end) newest; circBuff(2,2:end) newest; circBuff(3,2:end) newest; ]
 end

:d