2017-08-31 19 views
6

बढ़ने के अंत का उपयोग करते समय अप्रत्याशित व्यवहार मुझे अप्रत्याशित व्यवहार का सामना करना पड़ता है। मूल कोड:छवियों की निर्देशिका से वीडियो सरणी बनाने के दौरान एरे

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 का उपयोग करता हूं तो क्या होगा?

+3

मुझे इस सवाल का जवाब नहीं पता है, लेकिन मुझे पता है कि यह स्मृति आवंटन नहीं है और यह कि लूप में बढ़ते सरणी कम्प्यूटेशनल समय के मामले में बहुत खराब हैं। बस अपने vid' को 'vid = zeros ([आकार (छवि) endframe] के रूप में आवंटित करें), या, यदि आप पहले से छवि का आकार नहीं जानते हैं और आकार प्राप्त करने के लिए पहले को लोड नहीं करना चाहते हैं , अपने लूप को पीछे की ओर चलाएं ('ii = endframe: -1: startframe' के लिए) और 'vid' में' vid (:,:,:, ii) = ... 'के रूप में सहेजें, जो स्वचालित रूप से सरणी को प्रारंभ करता है उचित आकार – Adriaan

उत्तर

5

यह केवल MATLAB को प्रदर्शित करने के लिए चुनने वाला है।

MATLAB में, matrices अनंत आयामी हैं।

b = []; 
b(:,end+1) = 1; 

कि आप जानते हैं, आप एक विशिष्ट आयाम के आकार size साथ क्वेरी कर सकते हैं: एक अच्छा उदाहरण के रूप में, अपने b कोशिश की सुविधा देता है। जैसे size(b,2)1 देता है। लेकिन size(b,12345) वापस क्या करता है ?, ठीक है, यह 1 भी देता है, क्योंकि मैट्रिस अनंत आयामी हैं। 12345 वें आयाम में, b का आकार 1 है।

हालांकि, यदि आप size(b) टाइप करते हैं तो यह कितना भयानक होगा, यदि यह अनंत आयामों को आउटपुट करता है! इस प्रकार प्रदर्शित करते समय, MATLAB 2 dims या N-dims को प्रदर्शित करने के लिए डिफ़ॉल्ट होता है, जहां एन उस पर डेटा के साथ सबसे दूर आयाम होता है (गैर-सिंगलटन आयाम)।

इस प्रकार, आप अपने c उदाहरण के साथ जो देख रहे हैं वह प्रदर्शन फ़ंक्शन द्वारा अजीब व्यवहार है, size फ़ंक्शन नहीं। size(c,3)1 देता है। यह [] द्वारा केवल MxPx0 वैरिएबल को भरते समय परिवर्तनीय (c(:,:,end)=img, end के साथ क्या होता है?), जो अनिवार्य रूप से एक खाली चर है, के कारण होता है, केवल पहले दो आयामों का आकार शून्य पर सेट करता है।

+0

मैं समझने की कोशिश करता हूं कि जब मैं c = []; c (:,:, end + 1) = 1 का उपयोग करता हूं; आकार (सी, 3) मुझे मिल जाएगा 2. मेरी सामान्य समझ यह है कि मुझे 1. –

+0

@AssafLivne 'आकार (सी, 3)' क्या होना चाहिए? वह आकार +1 क्या है? –

+1

मुझे लगता है कि उसका मतलब है कि वह अपने प्रश्न में 'बी' से तुलना करें। या, क्यों पहले आयाम शून्य पर सेट करते हैं जबकि बाकी सभी सेट 1 पर सेट होते हैं? – Adiel

संबंधित मुद्दे