Matlab 预分配,猜猜是大矩阵还是小矩阵?

标签 matlab memory-management matrix

根据这个question ,我应该尝试使用 Preallocation is Matlab。

现在我遇到一种情况,我无法计算要预分配的矩阵的确切大小。我能猜出大小。

假设矩阵的实际大小是100,但我不知道。嘘

哪种场景效率更高:

  1. 我应该大手大脚吗?我猜是一个大矩阵,最后我删除了额外的行。
  2. 我应该吝啬吗?我猜是小号,如果错了,我会添加新行。

谢谢。

最佳答案

在我看来,答案比@natan 描述的要复杂一些。 我认为他的回答没有考虑到两个因素:

  1. 可能需要的内存副本:当您低估矩阵大小并重新分配它时,应将其所有旧值复制到新分配的位置。

  2. 内存块的连续性:有时 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/

相关文章:

c++ - 为什么我分配的内存块不一致?

r - 计算 R 矩阵中每列特定整数的数量

c++ - OpenGL - 从 Matrix 4x4 本地向上和向右?

matlab - 以符号方式求解矩阵方程

matlab - 解析一行以获取数字

image - matlab中image和imagesc有什么区别

c:内存分配(发生了什么)

algorithm - EM 算法代码不起作用

c++ - 异常安全构造函数

r - 在R的稀疏矩阵中直接创建伪变量集