我读了:How to create a buffer matrix in MATLAB for continuous measurements?,问题。我想知道是否有可能按顺序存储值而不是像问题那样反向存储值,而不是在每次迭代后使用fliplr(从左向右翻转)?
答案 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的性能不依赖于缓冲区大小,与简单的副本相比缓冲液中。
双缓冲可以根据要在任何情况下附加的数据来确定追加的预测时间。将来这个课程会给你一个双重缓冲的选择是或否 - 如果你不需要保证时间,事情就会加速。
答案 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