«Хакерский» способ - единственный способ сделать это. Тем не менее, вам не нужно проверять I <= цифра (х). Массив будет расширен автоматически (но без дублирования массива): </p>
x = zeros(1000,1);
for i = 1:10000
x(i) = rand;
end
x(i+1:end) = [];
РЕДАКТИРОВАТЬ: для простоты, сохраняя удвоение массива, вы можете написать класс или просто несколько вспомогательных функций (ниже).
EDIT2: использование вспомогательных функций замедлит работу по сравнению с ручным взломом. В MATLAB 2010 это все еще намного быстрее, чем наивный рост. В MATLAB 2011 наивный подход на самом деле быстрее, предполагая, что эта версия имеет более разумное распределение. Возможно, это достаточно быстро, так что взломать не нужно вообще. Спасибо Эндрю Янке за указание на это.
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