我需要在matlab中创建一个包含非常大的结构的队列。我不知道这个队列会有多大。 Matlab没有链表,我担心重复分配和复制真的会减慢这个必须运行数千次的代码。我需要某种方式来使用可扩展的数据结构。我在matlab帮助中找到了几个链表的条目,但我无法理解发生了什么。有人可以帮我解决这个问题吗?
答案 0 :(得分:6)
我发布了a solution一段时间回到了类似的问题。我尝试它的方法是使用初始大小BLOCK_SIZE
分配数组,然后根据需要继续增加BLOCK_SIZE
(只要有10%*BLOCK_SIZE
个空闲插槽)。
请注意,如果块大小合适,则性能与从头开始预分配整个阵列相当。请参阅另一篇文章,了解我所做的简单基准测试。
答案 1 :(得分:3)
只需创建一个结构数组,并在数组达到限制时将其大小加倍。这很好地扩展。
答案 2 :(得分:2)
如果您担心重复分配和复制会降低代码速度,请尝试一下。它实际上可能非常慢,但你可能会感到惊喜。
答案 3 :(得分:2)
好吧,我找到了简单的答案:
L = java.util.LinkedList;
答案 4 :(得分:1)
我认为内置的cell
结构适合存储可增长的结构。
我做了一个比较:
代码:
clear;
scale = 1000;
% dynamic size cell
tic;
dynamic_cell = cell(0);
for ii = 1:scale
dynamic_cell{end + 1} = magic(20);
end
toc
% preallocated cell
tic;
fixed_cell = cell(1, scale);
for ii = 1:scale
fixed_cell{ii} = magic(20);
end
toc
% java linked list
tic;
linked_list = java.util.LinkedList;
for ii = 1:scale
linked_list.add(magic(20));
end
toc;
结果:
Elapsed time is 0.102684 seconds. % dynamic
Elapsed time is 0.091507 seconds. % pre-allocated
Elapsed time is 0.189757 seconds. % Java LinkedList
我更改了scale
和magic(20)
,发现动态和预分配版本的速度非常接近。也许cell只存储指针式结构,并且在调整大小时效率很高。
Java方式比较慢。我发现它有时不稳定(当刻度非常大时它会崩溃我的MATLAB。)