Причина, по которой структуры в вашем примере не инициализируются должным образом, заключается в том, что используемый вами синтаксис обращается только к самому последнему элементу в массиве struct.Для несуществующего массива остальные из них неявно заполняются структурами, которые имеют значение по умолчанию []
во всех своих полях.
Чтобы сделать это поведение понятным, попробуйте создать короткий массив с clear edges; edges(1:3) = struct('weight',1.0)
иглядя на каждый из edges(1)
, edges(2)
и edges(3)
.Элемент edges(3)
имеет 1.0
в своем весе, как вы хотите;остальные имеют []
.
Синтаксис для эффективной инициализации массива структур является одним из них.
% Using repmat and full assignment
edges = repmat(struct('weight', 1.0), [1 1000]);
% Using indexing
% NOTE: Only correct if variable is uninitialized!!!
edges(1:1000) = struct('weight', 1.0); % QUESTIONABLE
Обратите внимание на 1:1000
вместо просто 1000
при индексации вв массив неинициализированных ребер.
Существует проблема с формой edges(1:1000)
: если edges
уже инициализирован, этот синтаксис просто обновит значения выбранных элементов.Если у ребер более 1000 элементов, остальные останутся без изменений, и ваш код будет содержать ошибки.Или, если edges
- это другой тип, вы можете получить ошибку или странное поведение в зависимости от существующего типа данных.Для безопасности вам нужно сделать clear edges
перед инициализацией с использованием синтаксического индексации.Так что лучше всего выполнить полное назначение с помощью формы repmat
.
НО: Независимо от того, как вы его инициализируете, массив структур, подобных этому, всегда будет по своей природемедленно работать с большими наборами данных.Вы не можете выполнять настоящие «векторизованные» операции над ним, потому что все ваши примитивные массивы разбиты на отдельные mxArrays внутри каждого элемента структуры.Это включает в себя назначение поля в вашем вопросе - это невозможно векторизовать.Вместо этого вы должны переключить структуру массивов, как предполагает ответ Брайана Л.