La forma "hacky" es la única manera de hacerlo. Sin embargo, no necesita verificar i < = numel (x). La gama se ampliará automáticamente (pero sin duplicar matriz):
x = zeros(1000,1);
for i = 1:10000
x(i) = rand;
end
x(i+1:end) = [];
EDIT: Para que sea sencillo al tiempo que conserva la matriz de duplicación, puede escribir una clase, o simplemente un par de funciones de ayuda (abajo).
EDIT2: El uso de las funciones de ayuda ralentizará las cosas en comparación con el hack manual. En MATLAB 2010, todavía es mucho más rápido que el crecimiento ingenuo. En MATLAB 2011, el enfoque ingenuo es realmente más rápido, lo que sugiere que esta versión tiene una asignación más inteligente. Quizás es lo suficientemente rápido para que no se necesite ningún hack. Gracias a Andrew Janke por señalar esto.
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
EDITAR (de AndrewJanke)
Aquí está el código para comparar la velocidad de las implementaciones.
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
puede encontrar esta respuesta útil: http://stackoverflow.com/a/1549094/97160 – Amro
@Amro: Sí, gran respuesta como siempre . Pero esperaba que hubiera una función "mágica" de MATLAB que había pasado por alto. – Jacob