Индексирование структуры в matlab - PullRequest
0 голосов
/ 05 декабря 2018

У меня сложилось впечатление, что структура в matlab аналогична таблицам запросов в sql, но у меня есть ощущение, что я могу ошибаться.

У меня довольно большой набор данных, состоящий из множества записей и множества полей.В идеале я хочу индексировать структуру, извлекая только те данные, которые мне интересны. Вот пример набора данных

Cond       Type   Stime    ETime
    2       10      1       900
    2       10      1       900
    2       10      1       900
    3       1       901     1800
    3       1       901     1800
    4       1       1801    2700
    8       1       901     1800
    8       1       901     1800
    9       1       901     1800
    9       1       901     1800
    12      1       901     1800
    12      1       901     1800
    13      10      1       900
    13      10      1       900
    13      10      1       900
    16      1       901     1800
    16      1       901     1800
    17      10      1       900
    17      10      1       900
    17      10      1       900
    19      10      1       900
    19      10      1       900
    19      10      1       900
    20      10      1       900
    20      10      1       900
    20      10      1       900
    22      1       901     1800
    22      1       901     1800
    25      10      1       900
    25      10      1       900
    25      10      1       900
    27      1       901     1800
    27      1       901     1800
    28      1       901     1800
    28      1       901     1800
    30      1       1801    2700
    31      1       901     1800
    31      1       901     1800
    32      10      1       900
    32      10      1       900
    32      10      1       900
    35      10      1       900
    35      10      1       900
    35      10      1       900

Что я хочу сделать, это получить конкретные записи данных для примера анализа, который я хочувсе записи, где Type равен 10 или я хочу, чтобы все Cond из 1:20 имели ETime == 900.

. Я могу сделать это следующим образом:

idx = find([stats.Type] == 10);
[stats(idx).Stime]

но для нескольких типов мне нужен цикл for, поскольку при попытке использования вектора выдается ошибка.

idx = find([stats.Type] == 1:10); % Does not work


% must use this
temp = [];
for aa = 1:10
    idx = find([stats.Type] == aa);
    temp = horzcat(idx,temp);
end
[stats(temp).Stime]

Это неправильный способ использования структур?Существует ли более простой способ индексации структуры для извлечения данных, представляющих интерес?

1 Ответ

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

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


Если вы используете struct2table, то вы можете взаимодействовать с ним как с таблицей, что, как правило, значительноболее интуитивно понятный.

Структуры полезны, если в ваших полях разное количество элементов (т. е. вы не можете сформировать согласованную таблицу высот).Почти во всех других областях я считаю, что таблицы проще в использовании.

С таблицами вы можете использовать:

  • Логическое индексирование

  • Сортировка (включая sortrows по имени столбца)

  • Семейство операций "соединения"

  • Точечная запись для доступа к столбцам таблицы по имени, как и для доступа к полям структуры или выбора нескольких столбцовпо имени, используя myTable( :, {'col1','col2'} ).- Вам не нужны странные синтаксические трюки, такие как [stats.Type] для группировки выходов, вы можете просто сделать stats.Type

Я бы тогда использовал ismember, чтобы сравнить несколько элементов с таблицейколонка ...

idx = ismember( stats.Type, 1:10 );

Если вам не нужны индексы, вы можете пропустить, используя find для скорости, и просто напрямую индексировать, используя idx.

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