Не могу перебрать поле структуры matlab - PullRequest
1 голос
/ 28 марта 2019

В настоящее время я работаю с Matlab и пытаюсь извлечь некоторые данные из имеющейся у меня struct , но, кажется, это не так просто, как я думал.

structExample = 1x100000
fieldnames(structExample)

ans =

  6×1 cell array

    {'a'}
    {'b'}
    {'c'}
    {'d'}
    {'e'}
    {'f'}

Меня интересуют значения, сохраненные в поле 'b'. Когда я набираю structExample.b, он печатает все значения, но когда я делаю

values = structExample.b

Сохраняет только первые значения ([1.2,5.33]). 'b' имеет двойные значения, например

[1.2,5.33], 1x86double, 1x120double ...

Моя цель - создать их с помощью cdfplot ()
Поэтому я подумал, может быть, перебрать все значения в поле и сохранить их в отдельном массиве. Но я не знаю, как выполнить итерацию, поскольку structExample.b принимает только первые значения. Есть идеи?

Edit:
structExample.b (3) возвращает

Ожидается один вывод из выражения фигурной скобки или индексации точек, но было 41817 результатов.

1 Ответ

2 голосов
/ 28 марта 2019

Когда вы получаете доступ к полю структурного массива , он возвращает разделенный запятыми список значений. По умолчанию только первое значение в списке будет присвоено одной переменной. Если вы хотите захватить все эти значения, вы должны собрать их, используя [] (для нормального массива ) или {} (для массива ячеек ). Поскольку вы имеете дело с наборами данных разного размера в каждой структуре, вам нужно будет использовать массив ячеек:

values = {structExample.b};

Итак, values{1} будет содержать [1.2,5.33], values{2} будет содержать 1x86 double и т. Д.

Для случая, когда вы хотите выполнить итерацию по массиву структуры, вы должны проиндексировать элементы и поля массива в правильном порядке. Сначала нужно проиндексировать элемент (который дает вам один элемент структуры из массива), а затем проиндексировать нужное поле:

value = structExample(3).b;  % Field b of the third array element

Для дополнительного случая, когда вы хотите собрать поле из индексированного подмножества элементов в массиве вашей структуры, вы должны объединить схемы индексации и сбора сверху. Например:

values = {structExample([structExample.a] == 1).b};

Это соберет все значения полей a из structExample в массив, найдет логический индекс , для которого они равны 1, индексирует массив structExample с этим логическим массивом, затем собрать значения поля b из этого подмассива и поместить их в массив ячеек.

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