Предварительно выделить массив ячеек объектов
В 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);
Я рекомендую придерживаться вашего подхода с использованием массива клеток. Один из других ответов упоминается с использованием массива объектов; Я НЕ рекомендую делать это! Назначение в предварительно выделенный массив ячеек происходит быстро, тогда как назначение в массив объектов сравнительно очень медленно. Я думаю, что у вас уже есть правильный подход.