"hacky" जिस तरह से यह करने के लिए एक ही रास्ता है। हालांकि, आपको < = numel (x) की जांच करने की आवश्यकता नहीं है। सरणी का विस्तार अपने रहेगी (लेकिन सरणी के बिना दोहरीकरण):
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
आपको यह उत्तर उपयोगी हो सकता है: http://stackoverflow.com/a/1549094/97160 – Amro
@Amro: हाँ, हमेशा के रूप में महान जवाब । लेकिन मैं उम्मीद कर रहा था कि कुछ "जादू" MATLAB फ़ंक्शन था जिसे मैंने अनदेखा किया था। – Jacob