在Matlab(缓冲区)中更改其数据和大小的大数组的内存

时间:2013-11-22 23:26:13

标签: arrays matlab multidimensional-array

我正在尝试为大型数组(如指定大小的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的数组,那么如果我在内存中有这么多垃圾就会非常糟糕。如果是错的,还有其他方法可以编写这样的缓冲区吗?

2 个答案:

答案 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