gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:53:55 25 4
gpt4 key购买 nike

根据这个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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com