用于在Matlab中改变数据和大小的大数组的内存(缓冲区)



我正试图为指定大小的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);

您的代码需要复制整个缓冲区内容,这对于大型缓冲区来说会很慢。

最新更新