因此,当您大致了解大小要求时,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) = [];

最佳答案

“hacky”方式是唯一的方法。但是,您不需要检查i

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

编辑:为保持简单,而仍保留数组加倍,您可以编写一个类,或简单地添加一些辅助函数(如下)。

编辑2:与手动修改相比,使用助手功能会降低速度。在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

09-07 23:46