matlab预分配矩阵,Matlab Preallocation,猜一个大矩阵还是一个小矩阵?

在我看来,答案比@natan描绘的要复杂得多.

我认为他的答案没有考虑到两个因素:

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

>内存块的连续性:有时Matlab能够在旧矩阵的末尾连续分配新的内存.原则上,在这种情况下,旧值不需要复制到新位置 – 因为它与旧的位置相同.但是,如果将行添加到2D矩阵,则即使在此场景中也需要复制内容,因为Matlab以行主要方式将矩阵存储在内存中.

所以,我的答案是这样的:

首先,你究竟对矩阵的大小知之甚少:如果你知道一个维度 – 将它作为矩阵的行数,那么你只需要改变列数.这样,如果您需要复制已存储的数据,则会以较大的块复制它.

其次,它取决于你拥有多少可用RAM.

如果你不吝啬RAM,那么过度估算并没有错.

但是,如果您缺少RAM,请考虑进行估算.但是当您重新分配时,在每次迭代时增加新的块大小:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值