我正试图为指定大小的100x100等大数组创建一个缓冲区(而不是圆形缓冲区)。
我在网上找不到任何好的解决方案,所以我试着自己写。这是代码:
在这个例子中,ple I将只使用小数组2x2,缓冲区大小为3
A = [1 1; 1 1];
B = [2 2; 2 2];
C = [3 3; 3 3];
buffer = [C B A];
D = [4 4; 4 4];
现在我想推动D和弹出A看起来像[D C B]
buffer = buffer(1:2,3:6); %creating [C B]
buffer = [D buffer] %creating [D C B]
现在的问题是:记忆中的A呢?它还在还是被删除了?如果我使用大约1000个大小为[500x500]、缓冲区大小为3的数组,如果内存中有这么多垃圾,那就太糟糕了。如果是错误的,有没有其他方法可以写入这样的缓冲区?
您的"推前"语法buffer = [D buffer]
似乎很好。
至于"推回",您可以以类似的方式连接(buffer = [buffer D];
),也可以索引到末尾:
buffer(:,end:end+size(D,2)) = D; % assuming size(D,1) equals size(buffer,1)
对于"pop",您可以像示例中那样执行buffer=buffer(keepRows,keepCols);
,也可以将[]
分配给要删除的任何索引。例如,给定buffer = [C B A];
,删除C
的"pop-front"为:
buffer(:,1:size(C,2)) = [];
您可以通过这种方式删除任何值,包括中心元素:
buffer(:,3:4) = []; % remove B from [C B A]
通过这种方式,buffer
将被重写,并且删除的值将丢失。但是,用于组成buffer
的原始变量(例如B
)会一直保留到清除为止。请记住,当执行buffer = [C B A];
时,它会在执行水平串联时复制每个变量的内容,而不是将数组放在列表中。
我曾经将数组截断性能与v(end-N:end)=[]
语法和v=v(1:N-1)
语法进行了非常彻底的比较。虽然这只是针对1D矢量,但可能会有所帮助。您可能还想看看这篇关于自动阵列增长性能的文章。
我建议使用java链表。
import java.util.LinkedList
q=linkedList()
q.add(A);
q.add(B);
q.add(C);
%get top element
o=q.pop();
%insert new
q.add(D);
您的代码需要复制整个缓冲区内容,这对于大型缓冲区来说会很慢。