我正在尝试为大型数组(如指定大小的100x100)创建缓冲区(不是圆形缓冲区)。
我在互联网上找不到任何好的解决方案,所以我想自己写一下。 这是代码:
在这个例子中,我将只使用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的数组,那么如果我在内存中有这么多垃圾就会非常糟糕。如果是错的,还有其他方法可以编写这样的缓冲区吗?
答案 0 :(得分:1)
我建议使用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);
您的代码需要复制整个缓冲区内容,这对于大缓冲区来说会很慢。
答案 1 :(得分:1)
您的“推送前端”语法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
将被重写,删除的值将丢失。但是,用于撰写B
的原始变量(例如buffer
)在您清除它之前一直存在。请记住,当您执行buffer = [C B A];
时,复制< / strong>执行horizontal concatenation时每个变量的内容,而不是将数组放在列表中。
我曾使用v(end-N:end)=[]
语法和v=v(1:N-1)
语法执行pretty thorough comparison数组截断性能。虽然这仅适用于一维矢量,但它可能会有所帮助。您可能还想查看this article on automatic array growth performance。