предварительно выделить массив ячеек объектов - PullRequest
2 голосов
/ 13 февраля 2012

В 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 ]

2 голосов
/ 13 февраля 2012

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

Когда вы выделяете массив ячеек, вы на самом деле не помогаете 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
0 голосов
/ 13 февраля 2012
pointcell = cell(npoints, 1);

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

0 голосов
/ 13 февраля 2012

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

pointcell = cell(npoints);

или

pointcell = {};
pointcell{1, npoints} = [];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...