代码之家  ›  专栏  ›  技术社区  ›  rlbond

MATLAB中的可生长数据结构

  •  6
  • rlbond  · 技术社区  · 16 年前

    我需要在matlab中创建一个队列来保存非常大的结构。我不知道这个队会排多大。Matlab没有链表,我担心重复的分配和复制会减慢代码的运行速度,这段代码必须运行数千次。我需要某种方法来使用可增长的数据结构。我在matlab帮助中找到了一些链表条目,但我不明白发生了什么。有人能帮我解决这个问题吗?

    5 回复  |  直到 16 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

    我发布了 a solution 又回到了一个类似的问题。我尝试的方法是用初始大小分配数组 BLOCK_SIZE 块大小 根据需要(当 10%*BLOCK_SIZE 空闲插槽)。

    请注意,如果有足够的块大小,性能相当于从一开始就预分配整个阵列。请看另一篇文章,我做了一个简单的基准测试。

        2
  •  3
  •   Pyrolistical    16 年前

    只需创建一个结构数组,当数组达到极限时,将数组的大小增加一倍。这个比例很好。

        3
  •  2
  •   David    16 年前

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

    Beware of premature optimization.

        4
  •  2
  •   rlbond    16 年前

    L = java.util.LinkedList;
    
        5
  •  1
  •   Edward Shi    14 年前

    我认为这是内在的 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只存储指针式的结构,并且在调整大小方面很有效。