在MATLABàlastd :: vector :: reserve(n)中预分配内存

时间:2012-02-13 16:45:38

标签: c++ matlab optimization

因此,当您大致了解尺寸要求时,reserve非常有用。有没有人知道在MATLAB中预先分配数组的类似方法?

我对hacky(但有效)的方法并不感兴趣,如下所示:

x = zeros(1000,1);
for i = 1:10000
    if i > numel(x)
       x = [x;zeros(size(x))];
    end
    x(i) = rand;
end
x(i+1:end) = [];

3 个答案:

答案 0 :(得分:3)

“hacky”方式是唯一的方法。但是,您不需要检查i< = numel(x)。该数组将自动扩展(但没有数组加倍):

x = zeros(1000,1);
for i = 1:10000
    x(i) = rand;
end
x(i+1:end) = [];

编辑:为了保持简单,同时仍然保持数组加倍,你可以写一个类,或者只是一些辅助函数(如下)。

EDIT2:与手动黑客相比,辅助功能的使用会降低速度。在MATLAB 2010中,它仍然比天真的增长快得多。在MATLAB 2011中,天真的方法实际上更快,这表明该版本具有更智能的分配。也许它足够快,所以根本不需要黑客攻击。感谢Andrew Janke指出这一点。

function listtest()
    n = 10000;
    l = new_list();
    for i=1:n
        l = list_append(l, i);
    end
    a = list_to_array(l);
end

function l = new_list()
    l = [0 0];
end
function l = list_append(l, e)
    if l(1)+1 == length(l)
        l(length(l)*2) = 0;
    end
    l(1) = l(1)+1;
    l(l(1)+1) = e;
end
function a = list_to_array(l)
    a = l(2:1+l(1));
end
编辑(来自AndrewJanke)

这是用于比较实现速度的代码。

function manual_reserve_example(n)
x = zeros(1000,1);
for i = 1:n
    if i > numel(x)
       x = [x;zeros(size(x))];
    end
    x(i) = i;
end
x(i+1:end) = [];
end

function naive_growth(n)
x = 0;
for i = 1:n
    x(i) = i;
end
end

function compare_them(n)
fprintf('Doing %d elements in Matlab R%s\n', n, version('-release'));
tic;
naive_growth(n);
fprintf('%30s  %.6f sec\n', 'naive_growth', toc);
tic;
manual_reserve_example(n);
fprintf('%30s  %.6f sec\n', 'manual_reserve', toc);
tic;
listtest(n);
fprintf('%30s  %.6f sec\n', 'listtest', toc);
end

答案 1 :(得分:1)

您提供的示例最干净的解决方案是向后迭代。

for i = 10000:-1:1
    x(i) = rand;
end

这在最终大小实际上未知的情况下不起作用,但它对我来说比我预期的更方便。


否则我通常会在原始问题中显示“双溢出”算法。

干净的解决方案是围绕可重新调整的矢量大小调整算法包装Matlab类,然后使用该类。我不知道有什么理由不能建造这样的课程,但我从来没有真正坐下来试图实施一个。 (我很好奇,如果某个地方的文件交换已经存在一个例子。)

答案 2 :(得分:0)

有一种方法可以使用STRUCT和REPMAT命令在MATLAB 7.6(R2008a)中为结构预分配内存。

示例1:具有两个字段的结构

s.field1 s.field2

s = struct('field1',cell(1),'field2',cell(1));

示例2:具有子字段

的字段的结构

s.field1.subfield

s = struct('field1',struct('subfield',cell(1)));

示例3:结构数组

V(1).field1 ... V(100).field1

s = struct('field1',cell(1));
v = repmat(s,100,1);