Почему при создании объекта структуры MATLAB с пустой ячейкой вместо этого создается пустая структура? - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу построить объект структуры с тремя свойствами:

arg1 = 42;
arg2 = 'test';
arg3 = cell(0);

Но если я попытаюсь инициализировать этот объект:

struct('arg1', arg1, 'arg2', arg2, 'arg3', arg3);

Возвращает пустую структуру:

ans = 

  0×0 empty struct array with fields:

    arg1
    arg2
    arg3

Я понял, что виновата пустая ячейка, поэтому, если я инициализирую ее без пустой ячейки, она возвращает правильное значение:

ans = 

  struct with fields:

    arg1: 42
    arg2: 'test'
    arg3: []

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

Есть ли способ выйти из этой проблемы?

Ответы [ 2 ]

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

@ Объяснение Wolfie для поведения правильно.

Обходной путь - поместить данные в массивы ячеек следующим образом:

>> struct('arg1', {arg1}, 'arg2', {arg2}, 'arg3', {arg3})

ans = 

  struct with fields:

    arg1: 42
    arg2: 'test'
    arg3: {}

Это работает из-заэта строка в документации:

  • Если какой-либо из входных значений является массивом нескалярных ячеек, то s имеет те же размеры, что и массив нескалярных ячеек.

Итак, мы делаем все входные значения нескалярными массивами ячеек.{arg3} - это то же самое, что и {{}}, массив ячеек с одним элементом: пустой массив ячеек.

Обратите внимание, что можно создать массив структур с этим синтаксисом:

>> struct('arg1', {1,2,3}, 'arg2', {arg2}, 'arg3', {arg3})

ans = 

  1×3 struct array with fields:

    arg1
    arg2
    arg3

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

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

Это задокументированное поведение:

s = struct(field,value) создает структурный массив с указанными field и values.Входной аргумент value может быть любым типом данных, например числовым, логическим, символьным или массивом ячеек.

  • Если любой из входных данных value является нескалярным массивом ячеектогда s имеет те же размеры, что и нескалярный массив ячеек.[...]

  • Если value - пустой массив ячеек {}, то s - пустая (0 на 0) структура.Чтобы указать пустое поле и сохранить значения других полей, используйте [] в качестве ввода значения вместо

Еда на вынос для вас является последнейline.

Чтобы обойти это, вам нужно будет выполнить такие проверки, как

if iscell( argX ) && isempty( argX )
    argX = [];
end

Если в вашей структуре всегда всего 3 элемента, то это довольно просто реализовать.

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