【发布时间】:2010-04-12 20:08:27
【问题描述】:
我需要在 matlab 中创建一个包含非常大的结构的队列。我不知道这个队列会有多大。 Matlab 没有链表,我担心重复分配和复制真的会减慢必须运行数千次的代码。我需要某种方式来使用可增长的数据结构。我在 matlab 帮助中找到了一些链表条目,但我不明白发生了什么。有人可以帮我解决这个问题吗?
【问题讨论】:
标签: matlab linked-list
我需要在 matlab 中创建一个包含非常大的结构的队列。我不知道这个队列会有多大。 Matlab 没有链表,我担心重复分配和复制真的会减慢必须运行数千次的代码。我需要某种方式来使用可增长的数据结构。我在 matlab 帮助中找到了一些链表条目,但我不明白发生了什么。有人可以帮我解决这个问题吗?
【问题讨论】:
标签: matlab linked-list
我不久前发布了a solution 类似的问题。我尝试的方法是分配具有初始大小BLOCK_SIZE 的数组,然后根据需要将其增加BLOCK_SIZE(只要空闲插槽少于10%*BLOCK_SIZE)。
请注意,如果块大小足够,性能与从一开始就预先分配整个数组相当。请参阅另一篇文章了解我所做的简单基准测试。
【讨论】:
只需创建一个结构数组,并在达到限制时将数组的大小加倍。这可以很好地扩展。
【讨论】:
x(2*length(x)) = ...your 'empty' struct
如果您担心重复分配和复制会减慢代码速度,请尝试一下。它实际上可能非常缓慢,但您可能会感到惊喜。
【讨论】:
嗯,我找到了简单的答案:
L = java.util.LinkedList;
【讨论】:
我认为内置的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 崩溃)。
【讨论】: