Массив классов MATLAB - PullRequest
       17

Массив классов MATLAB

3 голосов
/ 09 ноября 2008

Каков наилучший способ управления большим количеством экземпляров одного и того же класса в 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.

, но все еще не приемлемая производительность, особенно с учетом увеличения накладных расходов на перераспределение

Есть ли способ предварительно выделить массив классов? Любые идеи о том, как эффективно управлять количествами объектов?

Спасибо
Dani

Ответы [ 3 ]

5 голосов
/ 10 марта 2010

Пришло так поздно, но разве это не было бы другим решением?

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.
4 голосов
/ 13 ноября 2008

Это решение расширяется до Ответ Марка . Используйте 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.
2 голосов
/ 10 ноября 2008

repmat ваш друг:

b = repmat(Request, 1000, 1);

Elapsed time is 0.056720 seconds


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

Рост при добавлении ужасно медленный, поэтому Млинт призывает его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...