青春有我
在尝试节省空间时考虑性能的另一种方法是大批量预分配内存,根据需要添加更多批次。如果您必须在不知道预先确定的数量的情况下添加大量项目,这非常适合。BLOCK_SIZE = 2000; % initial capacity (& increment size)listSize = BLOCK_SIZE; % current list capacitylist = zeros(listSize, 2); % actual listlistPtr = 1; % pointer to last free positionwhile rand<1-1e-5 % (around 1e5 iterations on avrg) % push items on list list(listPtr,:) = [rand rand]; % store new item listPtr = listPtr + 1; % increment position pointer % add new block of memory if needed if( listPtr+(BLOCK_SIZE/10) > listSize ) % less than 10%*BLOCK_SIZE free slots listSize = listSize + BLOCK_SIZE; % add new BLOCK_SIZE slots list(listPtr+1:listSize,:) = 0; endendlist(listPtr:end,:) = []; % remove unused slots编辑:作为时间比较,请考虑以下情况:与上述50000次迭代相同的代码。事先预先分配整个矩阵: list = zeros(50000,2); list(k,:) = [x y];动态向矩阵添加向量: list = []; list(k,:) = [x y];在我的机器上,结果是:1)经过的时间是0.080214秒。2)经过的时间是0.065513秒。3)经过的时间是24.433315秒。更新:在评论中讨论后,我使用最新的R2014b版本重新运行了一些测试。结论是最新版本的MATLAB大大提高了自动阵列增长的性能!然而有一个问题; 数组必须在最后一个维度上增长(在2D矩阵的情况下为列)。这就是为什么在没有预分配的情况下追加原先预期的行仍然太慢的原因。这是上面提出的解决方案可以真正帮助的地方(通过批量扩展阵列)。请参阅此处获取完整的测试集:https://gist.github.com/amroamroamro/0f104986796f2e0aa618