Эффективная индексация структур в MATLAB

До недавнего времени я хранил данные временных рядов в struct s в MATLAB, поместив индекс после имени поля, например:

Structure.fieldA(1) = 23423

Итак, структура имеет набор полей, и каждое поле является вектором.

Я видел много других программ, использующих другой формат, где сама структура индексируется, и каждый индекс структуры содержит набор полей, например:

Structure(1).fieldA

Какой самый эффективный метод? Должен ли я придерживаться опции top или переключать свои программы на использование метода bottom?

1 ответ

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

Из собственной документации MATLAB

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

Мы можем проверить использование памяти на простом примере

S = struct('field1', {1, 2}, 'field2', {3, 4});
SArray = struct('field1', {[1,2]}, 'field2', {[3,4]});

whos S*
%  Name        Size            Bytes  Class     Attributes
%
%  S           1x2               608  struct
%  SArray      1x1               384  struct

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

subset = SArray(1:3);

% Compared to
subset.field1 = S.field1(1:3);
subset.field2 = S.field2(1:3);

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

S(1).field1 = [1,2];
S(2).field1 = 3;

Какое решение лучше, действительно зависит от данных и того, как вы их используете. Если у вас большой объем данных, первый вариант, вероятно, будет предпочтительнее из-за меньшего объема памяти.

Если ваш код работает на вас, я не буду беспокоиться о преобразовании его просто ради использования другого соглашения, если только у вас нет проблем с производительностью (в этом случае используйте struct массивов) или трудности с доступом / изменением данных (используйте массив struct).

Другие вопросы по тегам