Похоже, вы пытаетесь создать массив объектов-дескрипторов (стрелков) и сохранить его в свойстве другого объекта-дескриптора (сквардрона).У меня было очень подобное обсуждение проблемы , которое могло бы вам помочь.
Короче: то, что вы делаете, может быть не очень красиво, но уже может быть довольно хорошо.
При создании массива в Matlab обычно хорошей идеей является предварительное выделение резервной памяти, что значительно повышает производительность.
В обычном случае что-то вроде этого:
a=zeros(1,1000);
for n=1:1000
a(n)=n;
end
(здесь a = 1: 1000; было бы еще лучше)
Для объектов предварительное выделение выполняется путем назначения одного из объектов последнему полю в массиве.Затем Matlab заполняет остальные поля ранее созданными объектами (дескрипторами), вызывая конструктор этого объекта без аргументов (см. Справка по Matlab ).Следовательно, предварительное выделение объектов может выглядеть следующим образом:
a(1,1000)=ObjectConstructor();
for n=1:1000
a(n)=ObjectConstructor();
end
или просто
for n=1000:-1:1
a(n)=ObjectConstructor();
end
Убедившись, что Shooter можно вызывать без аргументов, вы должны иметь возможность сделать что-то вроде:
for iShooter = obj.num_shooters:-1:1
obj.ShooterArray(iShooter) = Shooter(num_targets, time_steps);
end
Однако оказывается, что по какой-то причине это прямое сохранение массива объектов в свойстве другого объекта создает очень плохую производительность.(Возможно, предварительное выделение массива не работает в этом случае).Следовательно, использование вспомогательной переменной и выделение полного массива сразу для свойства в этом случае является хорошей идеей для повышения производительности.
Я бы попробовал:
for iShooter = obj.num_shooters:-1:1
a(iShooter) = Shooter(num_targets, time_steps);
end
obj.ShooterArray = a;
Еще раз - для получения дополнительной информации.подробнее см. это обсуждение