MATLAB中可扩展的数据结构

时间:2010-04-12 20:08:28

标签: matlab linked-list

我需要在matlab中创建一个包含非常大的结构的队列。我不知道这个队列会有多大。 Matlab没有链表,我担心重复分配和复制真的会减慢这个必须运行数千次的代码。我需要某种方式来使用可扩展的数据结构。我在matlab帮助中找到了几个链表的条目,但我无法理解发生了什么。有人可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:6)

我发布了a solution一段时间回到了类似的问题。我尝试它的方法是使用初始大小BLOCK_SIZE分配数组,然后根据需要继续增加BLOCK_SIZE(只要有10%*BLOCK_SIZE个空闲插槽)。

请注意,如果块大小合适,则性能与从头开始预分配整个阵列相当。请参阅另一篇文章,了解我所做的简单基准测试。

答案 1 :(得分:3)

只需创建一个结构数组,并在数组达到限制时将其大小加倍。这很好地扩展。

答案 2 :(得分:2)

如果您担心重复分配和复制会降低代码速度,请尝试一下。它实际上可能非常慢,但你可能会感到惊喜。

Beware of premature optimization.

答案 3 :(得分:2)

好吧,我找到了简单的答案:

L = java.util.LinkedList;

答案 4 :(得分:1)

我认为内置的cell结构适合存储可增长的结构。 我做了一个比较:

  • 动态大小单元格,单元格大小会改变每个循环
  • 预先分配的单元格
  • Java LinkedList

代码:

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

我更改了scalemagic(20),发现动态和预分配版本的速度非常接近。也许cell只存储指针式结构,并且在调整大小时效率很高。 Java方式比较慢。我发现它有时不稳定(当刻度非常大时它会崩溃我的MATLAB。)