बढ़ने के अंत का उपयोग करते समय अप्रत्याशित व्यवहार मुझे अप्रत्याशित व्यवहार का सामना करना पड़ता है। मूल कोड:छवियों की निर्देशिका से वीडियो सरणी बनाने के दौरान एरे
vid = [];
for i =startframe:endframe
image = [directoryOfImages ,'\', images_names{1,i}];
vid(:,:,:,end+1) = imread(image);
waitbar((i-startframe)/(endframe-startframe));
end
तो मैं बात की जांच करने के लिए इस कोड को भाग गया:
a = []; size(a)
a(end+1) = 1; size(a)
पहले आकार [0, 0]
था और दूसरा आकार [1, 1]
था। एक ही अपेक्षित व्यवहार मैं इस कोड में मिल गया:
b = []; size(b)
b(:,end+1) = 1; size(b)
पहले आकार [0, 0]
था और दूसरा आकार [1, 1]
था। लेकिन इस कोड में, कुछ अजीब हुआ:
c = []; size(c)
c(:,:,end+1) = 1; size(c)
यहाँ जबकि पहले आकार [0,0]
था और दूसरा एक [1,1,2]
था। यह बहुत अप्रत्याशित था। मैं c
मुद्रित और मैं यह मिल गया:
>>c
c(:,:,1) =
0
c(:,:,2) =
1
अंत में, मैं इस स्क्रिप्ट भाग गया:
c=[]; c(:,:,end)=1; size(c)
और मैं [1, 1]
मिला है।
कोई बता सकता है कि यहां क्या हो रहा है? जब मैं c=[]
का उपयोग करता हूं तो क्या मुझे [0,0,1]
के आकार के साथ एक खाली सरणी मिलती है? तो size(c)
कैसे इसका उल्लेख नहीं करता है? और जब मैं c(:,:,end)=1;
का उपयोग करता हूं तो इसका आकार [1,1,1]
नहीं है? और जब मैं c(:,:,:,end)=1
का उपयोग करता हूं तो क्या होगा?
मुझे इस सवाल का जवाब नहीं पता है, लेकिन मुझे पता है कि यह स्मृति आवंटन नहीं है और यह कि लूप में बढ़ते सरणी कम्प्यूटेशनल समय के मामले में बहुत खराब हैं। बस अपने vid' को 'vid = zeros ([आकार (छवि) endframe] के रूप में आवंटित करें), या, यदि आप पहले से छवि का आकार नहीं जानते हैं और आकार प्राप्त करने के लिए पहले को लोड नहीं करना चाहते हैं , अपने लूप को पीछे की ओर चलाएं ('ii = endframe: -1: startframe' के लिए) और 'vid' में' vid (:,:,:, ii) = ... 'के रूप में सहेजें, जो स्वचालित रूप से सरणी को प्रारंभ करता है उचित आकार – Adriaan