Растущая структура данных в MATLAB - PullRequest
6 голосов
/ 13 апреля 2010

Мне нужно создать очередь в Matlab, которая содержит очень большие структуры. Я не знаю, насколько большой станет эта очередь. Matlab не имеет связанных списков, и я беспокоюсь, что повторное выделение и копирование действительно замедлит этот код, который должен запускаться тысячи раз. Мне нужен какой-то способ использовать растущую структуру данных. Я нашел пару записей для связанных списков в справке matlab, но я не могу понять, что происходит. Может кто-нибудь помочь мне с этой проблемой?

Ответы [ 5 ]

6 голосов
/ 13 апреля 2010

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

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

3 голосов
/ 13 апреля 2010

Просто создайте массив структур и удвойте его размер, когда он достигнет предела. Это хорошо масштабируется.

2 голосов
/ 01 июля 2010

Ну, я нашел простой ответ:

L = java.util.LinkedList;
2 голосов
/ 13 апреля 2010

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

Остерегайтесь преждевременной оптимизации.

1 голос
/ 14 июля 2012

Я думаю, что встроенная структура cell подойдет для хранения растущих структур. Я сделал сравнение среди:

  • Динамический размер ячейки, размер ячейки меняется в каждом цикле
  • Предварительно выделенная ячейка
  • Java LinkedList

Код:

clear;
scale = 1000;

% dynamic size cell
tic;
dynamic_cell = cell(0);
for ii = 1:scale
  dynamic_cell{end + 1} = magic(20);
end
toc

% preallocated cell
tic;
fixed_cell = cell(1, scale);
for ii = 1:scale
  fixed_cell{ii} = magic(20);
end
toc

% java linked list
tic;
linked_list = java.util.LinkedList;
for ii = 1:scale
  linked_list.add(magic(20));
end
toc;

Результаты:

Elapsed time is 0.102684 seconds. % dynamic
Elapsed time is 0.091507 seconds. % pre-allocated
Elapsed time is 0.189757 seconds. % Java LinkedList

Я изменяю scale и magic(20) и нахожу, что динамические и предварительно выделенные версии очень близки по скорости. Может быть, ячейка хранит только структуры, похожие на указатели, и эффективна при изменении размера. Путь Java медленнее. И я нахожу это иногда нестабильным (он разбивает мой MATLAB, когда масштаб очень большой).

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