Доступ к элементам нескалярного массива структур

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

Создайте 1 3 структура s с полем f:

s(1).f = 1;
s(2).f = 'two';
s(3).f = 3 * ones(3);

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

s(1:3).f

или

s.f

MATLAB® возвращает данные из элементов в comma-separated list, который отображается можно следующим образом:

ans =
     1

ans =
     two

ans =
     3     3     3
     3     3     3
     3     3     3

Вы не можете присвоить список одной переменной с синтаксисом v = s.f потому что поля могут содержать различные типы данных. Однако можно присвоить элементы списка тому же количеству переменных, такой как

[v1, v2, v3] = s.f;

или присвойте элементам массива ячеек, такой как

c = {s.f};

Если все поля содержат тот же тип данных и могут сформировать гиперпрямоугольник, можно конкатенировать элементы списка. Например, создайте структуру nums со скалярными числовыми значениями в поле f, и конкатенируйте данные из полей:

nums(1).f = 1;
nums(2).f = 2;
nums(3).f = 3;

allNums = [nums.f]

Этот код возвращается

allNums =
     1     2     3

Если вы хотите обработать каждый элемент массива с той же операцией, используйте arrayfun функция. Например, считайте число элементов в поле f из каждого struct в массиве s:

numElements = arrayfun(@(x) numel(x.f), s)

Синтаксис @(x) создает анонимную функцию. Этот код вызывает numel функция для каждого элемента массива s, такой как numel(s(1).f), и возвращается

numElements =
     1     3     9

Для сопутствующей информации см.: