3

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.

ただし、特に再割り当てのオーバーヘッドの増加を考慮すると、まだ許容できるパフォーマンスではありません

クラス配列を事前に割り当てる方法はありますか?オブジェクトの大量のオブジェクトを効果的に管理する方法についてのアイデアはありますか?

ありがとう、
ダニ

4

3 に答える 3

5

遅くなりましたが、これは別の解決策ではありませんか?

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.
于 2010-03-10T14:48:33.053 に答える
4

このソリューションは、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.
于 2008-11-12T21:11:05.053 に答える
2

repmatあなたの友達です:

b = repmat(Request, 1000, 1);

Elapsed time is 0.056720 seconds


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

追加による成長は非常に遅いため、mlint はそれを呼び出します。

于 2008-11-09T21:49:46.617 に答える