структуры внутри структур в Matlab - PullRequest
0 голосов
/ 11 декабря 2018
s(1) = struct('a', 2, 'b', 3)
s(1).c(1) = struct('x',4, 'y',5);
s(1).c(2) = struct('x',6, 'y',7);
s(1).c(3) = struct('x',8, 'y',9);

Я получаю сообщение об ошибке, когда пытаюсь это

s(2) = struct('a', 10, 'b', 11)

Subscripted assignment between dissimilar structures.

Я ищу способ создания подполей c(1), c(2) и c(3) непосредственно, когда я 'я создаю s(1), есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете расширить массив struct с помощью индексации, не назначая каждое из полей, например:

s(2).a = 10;
s(2).b = 11;

В этом случае поле c остается пустым (то есть []).Нет необходимости, чтобы поля имели одинаковые типы, если s(1).c является структурой, тогда s(2).c может быть массивом или строкой или чем угодно.

С помощью deal вы можете включитьэто в одну строку:

[ s(2).a , s(2).b ] = deal( 10 , 11 );

Чтобы создать все элементы структуры s(1).c за один раз, вы можете использовать следующий синтаксис для struct:

s(1).c = struct('x',{4,6,8}, 'y',{5,7,9});

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

Конечно, вы можете объединить создание целогоc(1) в одну команду:

s(1) = struct('a', 2, 'b', 3, 'c', struct('x',{4,6,8}, 'y',{5,7,9}));

Аналогичным образом вы можете создать создание как s(1), так и s(2) за один раз:

s = struct('a', {2,10}, 'b', {3,11}, 'c', {struct('x',{4,6,8}, 'y',{5,7,9}),[]});

.... но это становится все более громоздким, чтобы писать в одной строке кода.Используйте эллипсы, чтобы сделать его более читабельным:

s = struct('a',{ 2,                                10 }, ...
           'b',{ 3,                                11 }, ...
           'c',{ struct('x',{4,6,8}, 'y',{5,7,9}), [] });
0 голосов
/ 11 декабря 2018

Вы можете создать свою структуру с c(1), c(2) и c(3) следующим образом:

s(1) = struct('a', 2, 'b', 3, 'c', [struct('x', 4, 'y', 5) struct('x', 6, 'y', 7) struct('x', 8, 'y', 9)])

Если вы создаете s(2), поля должны соответствовать тем, которые присутствуют в s(1),Однако, при желании, вы можете оставить c пустым в s(2).

s(2) = struct('a', 10, 'b', 11, 'c', struct)
...