Предварительно выделить массив ячеек объектов

В Matlab у меня есть класс с именем "point" (который не является классом-дескриптором).

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

    for k=1:npoints
      newpoint=point(*some parameters that depend on k*);
      pointcell{k}=newpoint; % pointcell grows at each iteration
    end

В этом примере массив ячеек "pointcell" растет на каждой итерации, что может быть неоптимальным с точки зрения производительности. Полезно ли предварительно распределять этот массив ячеек, и если да, как это можно сделать? Просто используя pointcell=cell(npoints) не похоже на работу..

3 ответа

Решение

Также учтите использовать массив объектов, а не массив ячеек объектов.

Когда вы выделяете массив ячеек, вы на самом деле не помогаете Matlab управлять памятью. Это связано с тем, что каждая ячейка может быть любого размера, поэтому единственное, что можно предварительно выделить, - это массив указателей. Проверьте это для получения дополнительной информации о массивах клеток.

И тогда вы можете выделить массив объектов, выполнив repmat

points = repmat(point(defaultVal1,defaultVal2,...),1,npoints);
for k=1:npoints
    newpoint=point(*some parameters that depend on k*);
    points(k)=newpoint; % pointcell grows at each iteration
end

Рекомендуемый способ предварительного выделения массива ячеек:

pointcell = cell(npoints);

или же

pointcell = {};
pointcell{1, npoints} = [];
pointcell = cell(npoints, 1);

Я рекомендую придерживаться вашего подхода с использованием массива клеток. Один из других ответов упоминается с использованием массива объектов; Я НЕ рекомендую делать это! Назначение в предварительно выделенный массив ячеек происходит быстро, тогда как назначение в массив объектов сравнительно очень медленно. Я думаю, что у вас уже есть правильный подход.

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