Всегда ли мне нужно использовать массив ячеек для присвоения нескольких значений массиву структур? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть вложенный массив struct, такой как

A(1).B(1).var1 = 1;
A(1).B(2).var1 = 2;

Теперь я хочу изменить значения var1 на использование элементов вектора x = [3; 4] для каждого из соответствующих значений.

Результат должен быть

A(1).B(1).var1 = 3;
A(1).B(2).var1 = 4;

Я пытался

% Error : Scalar structure required for this assignment.
A(1).B.var1 = x; 

% Error : Insufficient number of outputs from right hand side of equal sign to satisfy assignment.
[A(1).B.var1] = x(:);

Любопытно, что если x является массивом ячеек, второй синтаксис работает

x = {3, 4};
[A(1).B.var1] = x{:};

К счастью, не слишком сложно преобразовать мой числовой вектор в массив ячеек, используя mat2cell, но разве это единственный способ выполнить это назначение без цикла for?

Какой правильный синтаксис для множественного присваивания вложенному массиву struct? Могу ли я использовать числовые векторы или я должен использовать массивы ячеек?

1 Ответ

0 голосов
/ 18 мая 2018

Заявление

[A(1).B.var1] = x{:};

является сокращением для

[A(1).B.var1] = deal(x{:});

(см. Документацию для deal).

Таким образом, вы также можете написать

[A(1).B.var1] = deal(3,4);

Мне неизвестен какой-либо другой способ присвоения различных значений полю в массиве структуры в одной команде.

Если ваши значения находятся в числовом массиве, вы можете легко преобразовать его в массив ячеек, используя num2cell (что проще, чем mat2cell, который вы нашли).

data = [3,4];
tmp = num2cell(data);
[A(1).B.var1] = tmp{:};

В общем случае массивы struct довольно неудобны для использования в подобных случаях. Если вы можете, я бы порекомендовал вам хранить ваши данные в обычных числовых массивах, которые облегчают манипулирование многими элементами одновременно. Если вы настаиваете на использовании массива структуры (что удобно в определенных ситуациях), просто используйте цикл for:

data = [3,4];
for ii = 1:length(A(1).B)
   A(1).B(ii).var1 = data(ii);
end

Другой альтернативой является использование table.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...