Как продублировать структуру поля (нескалярной структуры) в Matlab? - PullRequest
0 голосов
/ 22 мая 2018

Предположим, у меня нескалярная структура

res = struct(); res(1).name = 'hello'; res(2).name = 'world';

Теперь я хочу скопировать все содержимое поля name в другое поле, скажем tag.

Ни одно из следующегоработал:

>> res.tag = res.name;
Scalar structure required for this assignment.

>> [res.tag] = [res.name];
Insufficient number of outputs from right hand side of equal sign to satisfy assignment.

>> {res.tag} = {res.name};
 {res.tag} = {res.name};
           ↑
Error: The expression to the left of the equals sign is not a valid target for an assignment.

Есть еще идеи?

1 Ответ

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

Используйте

[res(:).tag] = res(:).name;

или более просто, как вы открыли для себя:

[res.tag] = res.name;

Синтаксис с квадратными скобками слева подобен синтаксису, используемому для захватанесколько выходов, возвращаемых функцией: [out1, out2] = fun(...);см. специальные символы MATLAB .

На самом деле синтаксис res.tag создает список , разделенный запятыми [...] является стандартным для присвоения значений каждому элементу в одном таком списке;см. Назначение вывода из списка через запятую .

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

values = {10, 20};
[res.test] = values{:}; % works. {:} produces a comma-separated list
[res.test] = 10,20; % doesn't work. Use `deal`
[res.test] = deal(10,20); % works
[res.test] = 10; % doesn't work, unless `res` is scalar. Use `deal`
[res.test] = deal(10); % also works. 10 is repeated as needed

Причина, по которой ваша попытка [res.tag] = [res.name]; не работаетчто [res.name] с правой стороны объединяет результаты списка res.name, разделенных запятыми, в один массив, так что это тот же случай, что и [res.test] = 10; выше.

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