Как перераспределить массив classа в MATLAB?

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

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

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

Следующая ссылка может помочь:

http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh
Веб-архив мертвой ссылки

Новая ссылка:
http://de.mathworks.com/help/matlab/matlab_oop/creating-object-arrays.html

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

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

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

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

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

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

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

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

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

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

 ant = [1:5]; 

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

Не уверен, что я правильно понял вашу проблему, но если вы хотите инициализировать массив вашего самоопределяемого classа «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 
Interesting Posts
Давайте будем гением компьютера.