У меня есть массив объектов в MATLAB, и я вызвал их конструкторов в цикле:
antsNumber = 5;
for counter = 1: antsNumber
ant(counter) = TAnt(source, target);
end
MATLAB попросил меня использовать предварительное выделение для ускорения процесса. Я действительно знаю преимущества предварительного выделения, но я не знаю, как сделать это для объектов.
Следующая ссылка может быть полезна:
http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh
Веб-архив мертвой ссылки
Новая ссылка:
http://de.mathworks.com/help/matlab/matlab_oop/creating-object-arrays.html
Вот несколько вариантов, которые требуют, чтобы вы спроектировали конструктор класса для TAnt
, чтобы он мог обрабатывать случай без входного аргумента. :
Вы можете создать объект по умолчанию TAnt
(вызвав конструктор без входных аргументов) и реплицировать его с помощью REPMAT , чтобы инициализировать ваш массив перед входом в цикл for. :
ant = repmat (TAnt (), 1,5); % # Репликация объекта по умолчанию
Затем вы можете перебрать массив, перезаписывая каждый объект по умолчанию новым.
Если все ваши объекты TAnt
инициализируются одними и теми же данными, и они не производные от класса дескрипторов , вы можете создать 1 объект и используйте REPMAT , чтобы скопировать его:
ant = repmat (TAnt (источник, цель), 1,5); % # Репликация объекта
Это позволит вам вообще избежать зацикливания.
Если TAnt
является производным от класса дескрипторов , первый вариант выше должен работать нормально, а второй вариант - нет, потому что он даст вам 5 копий дескриптор для одного и того же объекта в отличие от 5 дескрипторов для различных объектов.
Предупреждение, которое он дает, излишне, если вы не занимаетесь тяжелыми вычислениями, я бы проигнорировал его.
Причина, по которой он выдает ошибку, заключается в том, что ему нужно найти новое место. Скажем, я даю вам список из семи объектов и говорю вам, что вам нужно разместить их все в ряд, затем я ухожу и даю вам еще несколько вещей, которые вам нужно куда-то положить. Затем я даю вам восьмой объект и говорю вам ставить его сразу после седьмого. Поскольку у вас есть что-то там, где находится восьмой объект, вам нужно либо переместить его в сторону, либо переместить все семь объектов. Matlab сообщает вам, что было бы быстрее, если бы вы сказали ему заранее, что хотите поместить туда 5 вещей, вместо того, чтобы просто давать ему вещи одну за другой, каждый раз ища новое место. Вы можете сделать это, добавив эту строку в начало вашего кода:
ant = [1:5];
Есть и другие способы сделать это.