Как предварительно выделить массив класса в MATLAB? - PullRequest
12 голосов
/ 24 марта 2010

У меня есть массив объектов в MATLAB, и я назвал их конструкторы в цикле:

antsNumber  = 5;
for counter = 1: antsNumber
    ant(counter) = TAnt(source, target);
end

MATLAB предупреждает меня использовать предварительное распределение для ускорения процесса. Я знаю преимущества предварительного распределения, но не знаю, как это сделать для объектов.

Ответы [ 4 ]

7 голосов
/ 24 марта 2010

Вот несколько опций, которые требуют, чтобы вы разработали конструктор класса для TAnt, чтобы он мог обрабатывать без входного аргумента case :

  • Вы можете создать объект TAnt по умолчанию (вызвав конструктор без входных аргументов) и скопировать его с REPMAT , чтобы инициализировать массив перед входом в цикл for:

    ant = repmat(TAnt(),1,5);  %# Replicate the default object
    

    Затем вы можете перебрать массив, перезаписывая каждый объект по умолчанию новым.

  • Если все ваши TAnt объекты инициализируются с одинаковыми данными, и они не получены из класса дескриптора , вы можете создать 1 объект и использовать REPMAT скопировать его:

    ant = repmat(TAnt(source,target),1,5);  %# Replicate the object
    

    Это позволит вам вообще избежать зацикливания.

  • Если TAnt является производным от класса дескриптора , первый вариант выше должен работать нормально, но второй вариант не будет работать, потому что он даст вам 5 копий дескриптора для того же объекта в отличие от 5 дескрипторов для отдельных объектов.

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

Предупреждение, которое он выдает, является излишним, если вы не занимаетесь тяжелыми вычислениями, я бы проигнорировал его.

Причина, по которой он выдает ошибку, заключается в том, что он должен найти новое место. Скажем, я даю вам список из семи предметов и говорю вам, что вам нужно разместить их все подряд, затем я ухожу и даю вам еще несколько вещей, которые нужно куда-то положить. Затем я даю вам восьмой объект и говорю вам поставить его сразу после седьмого. Поскольку у вас есть вещи, где находится восьмой объект, вы должны либо убрать его с дороги, либо вы должны переместить все семь объектов. Матлаб, говорит вам, что было бы быстрее, если бы вы сказали заранее, что вы хотите поместить туда 5 вещей, а не просто давать им вещи по одной, каждый раз искать новое место. Вы можете сделать это, добавив эту строку в начало вашего кода:

ant = [1:5];

Есть и другие способы сделать это тоже.

0 голосов
/ 21 июня 2017

Не уверен, правильно ли я понял вашу проблему, но если вы хотите инициализировать массив вашего самоопределяемого класса "TAnt", вот как я бы это сделал

  1. Для метода конструктора TAnt, поместите что-то вроде:

function obj = TAnt(source, target)
         if nargin > 0
              obj.mySource = source;
              obj.myTarget = target;
         else
              obj.mySource = defaultValue;
              obj.myTarget = defaultValue;
         end
    end

Затем для инициализации / предварительного выделения массива объектов TAnt по умолчанию,

ants(1,n) =  TAnt();  % n is the length of your ants array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...