的「哈克」的方法是做它的唯一途徑。但是,您不需要檢查我< = numel(x)。該陣列將被自動擴大(但沒有加倍數組):
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
EDIT(從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
你可能會覺得這個答案有幫助:http://stackoverflow.com/a/1549094/97160 – Amro 2012-02-13 17:08:57
@Amro:是的,好的答案一如既往。但是我希望有一些「魔術」MATLAB函數我忽略了。 – Jacob 2012-02-13 17:29:15