Эффективная индексация структур в 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
).