gpt4 book ai didi

c++ - 在 MATLAB 中预分配内存 à la std::vector::reserve(n)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:17 28 4
gpt4 key购买 nike

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

我对像下面这样的骇人听闻的(但有效的)方法并不感兴趣:

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 <= numel(x)。数组将自动扩展(但不会加倍数组):

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

编辑:为了在保持数组加倍的同时保持简单,您可以编写一个类,或者简单地编写一些辅助函数(如下)。

EDIT2:与手动 hack 相比,辅助函数的使用会减慢速度。在 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

关于c++ - 在 MATLAB 中预分配内存 à la std::vector::reserve(n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264364/

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