【问题标题】:Growable data structure in MATLABMATLAB 中的可增长数据结构
【发布时间】:2010-04-12 20:08:27
【问题描述】:

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

【问题讨论】:

    标签: matlab linked-list


    【解决方案1】:

    我不久前发布了a solution 类似的问题。我尝试的方法是分配具有初始大小BLOCK_SIZE 的数组,然后根据需要将其增加BLOCK_SIZE(只要空闲插槽少于10%*BLOCK_SIZE)。

    请注意,如果块大小足够,性能与从一开始就预先分配整个数组相当。请参阅另一篇文章了解我所做的简单基准测试。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 结构体是如何实现的?移动数组只是意味着复制指针吗?
      • 据我所知,Matlab 中的一切都是数据。所以结构只是数据。而且您不会“移动阵列”。只需将现有数组的大小加倍。 x(2*length(x)) = ...your 'empty' struct
      • @rlbond:是的,MATLAB 结构和单元不包含数据本身,而是指向数据的指针,因此所有操作都很便宜。
      【解决方案3】:

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

      Beware of premature optimization.

      【讨论】:

      • @rlbond:这确实很可悲。如果您想了解它,请转到 Matlab 的“桌面”菜单,然后打开分析器。
      【解决方案4】:

      嗯,我找到了简单的答案:

      L = java.util.LinkedList;
      

      【讨论】:

        【解决方案5】:

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

        • 动态大小的单元格,单元格的大小在每个循环中都会改变
        • 预分配小区
        • Java 链表

        代码:

        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 崩溃)。

        【讨论】:

          猜你喜欢
          • 2019-02-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-26
          • 2012-12-25
          • 2020-05-21
          相关资源
          最近更新 更多