根据这个question ,我应该尝试使用 Preallocation is Matlab。
现在我遇到一种情况,我无法计算要预分配的矩阵的确切大小。我能猜出大小。
假设矩阵的实际大小是100,但我不知道。嘘
哪种场景效率更高:
- 我应该大手大脚吗?我猜是一个大矩阵,最后我删除了额外的行。
- 我应该吝啬吗?我猜是小号,如果错了,我会添加新行。
谢谢。
最佳答案
在我看来,答案比@natan 描述的要复杂一些。 我认为他的回答没有考虑到两个因素:
可能需要的内存副本:当您低估矩阵大小并重新分配它时,应将其所有旧值复制到新分配的位置。
内存块的连续性:有时 Matlab 能够在旧矩阵的末尾连续分配新内存。原则上,在这种情况下,不需要将旧值复制到新位置——因为它与旧值相同,只是更大。 但是,如果您向二维矩阵添加行,即使在这种情况下也需要复制内容,因为 Matlab 在内存中以行优先方式存储矩阵。
所以,我的答案是:
首先,关于矩阵的大小,您究竟不知道什么:如果您知道一维 - 将其设为矩阵的行数,那么您只需更改列数。这样,如果您已经存储的数据需要被复制,它将以更大的 block 被复制。
其次,这取决于您有多少空闲 RAM 可供您使用。 如果您不缺 RAM,那么高估也没有错。
但是,如果您的 RAM 不足,请考虑低估。 但是当您重新分配时,在每次迭代时增加新的 block 大小:
BASIC_SIZE = X; % first estimate
NEW_SIZE = Y; % if need more, add this amount
factor = 2;
arr = zeros( m, BASIC_SIZE ); % first allocation, assuming we know number of rows
while someCondition
% process arr ...
if needMoreCols
arr(:, size(arr,2) + (1:NEW_SIZE) ) = 0; % allocate another block
NEW_SIZE = round(NEW_SIZE * factor); % it seems like we are off in estimation, try larger chunk next time factor should be > 1
end
end
arr = arr(:, 1:actualNumOfCols ); % resize to actual size, discard unnecessary columns
关于Matlab 预分配,猜猜是大矩阵还是小矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14049677/