【问题标题】:MATLAB class arrayMATLAB 类数组
【发布时间】:2010-09-21 12:43:38
【问题描述】:

在 MATLAB 中管理大量同一类的实例的最佳方法是什么?

使用幼稚的方式会产生极端的结果:

classdef Request
    properties
        num=7;
    end
    methods
        function f=foo(this)
            f = this.num + 4;
        end
    end
end

>> a=[];  

>> tic,for i=1:1000 a=[a Request];end;toc  

Elapsed time is 5.426852 seconds.  

>> tic,for i=1:1000 a=[a Request];end;toc  
Elapsed time is 31.261500 seconds.  

继承句柄大大改善了结果:

classdef RequestH < handle
    properties
        num=7;
    end
    methods
        function f=foo(this)
            f = this.num + 4;
        end
    end
end

>> tic,for i=1:1000 a=[a RequestH];end;toc
Elapsed time is 0.097472 seconds.
>> tic,for i=1:1000 a=[a RequestH];end;toc
Elapsed time is 0.134007 seconds.
>> tic,for i=1:1000 a=[a RequestH];end;toc
Elapsed time is 0.174573 seconds.

但仍然不是可接受的性能,特别是考虑到重新分配开销的增加

有没有办法预先分配类数组?关于如何有效地管理对象数量的任何想法?

谢谢,
丹妮

【问题讨论】:

    标签: performance arrays matlab oop


    【解决方案1】:

    这么晚了,但这不是另一种解决方案吗?

    a = Request.empty(1000,0); tic; for i=1:1000, a(i)=Request; end; toc;
    Elapsed time is 0.087539 seconds.
    

    甚至更好:

    a(1000, 1) = Request;
    Elapsed time is 0.019755 seconds.
    

    【讨论】:

      【解决方案2】:

      此解决方案扩展了 Marc's answer。使用 repmat 初始化 RequestH 对象数组,然后使用循环创建所需对象:

      >> a = repmat(RequestH,10000,1);tic,for i=1:10000 a(i)=RequestH;end;toc
      Elapsed time is 0.396645 seconds.
      

      这是对以下方面的改进:

      >> a=[];tic,for i=1:10000 a=[a RequestH];end;toc
      Elapsed time is 2.313368 seconds.
      

      【讨论】:

        【解决方案3】:

        repmat是你的朋友:

        b = repmat(Request, 1000, 1);
        
        Elapsed time is 0.056720 seconds
        
        
        b = repmat(RequestH, 1000, 1);
        Elapsed time is 0.021749 seconds.
        

        通过追加增长非常缓慢,这就是 mlint 将其称为的原因。

        【讨论】:

        • 问题:b = repmat(RequestH, 1000, 1); b(1).num=99; b(2).num ans = 99
        • 这就是句柄类的本质。它基本上是一个单例类,所以所有“实例”实际上都指向一个实例。我只是展示了加速。是否使用 Handle 类的天气是一个非常独立的问题。
        猜你喜欢
        • 2012-11-05
        • 2012-01-31
        • 2017-05-11
        • 2012-07-28
        • 1970-01-01
        • 2021-10-04
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多