2011-03-06 14 views
7

मेरे पास कोड का एक अनुभाग है जो छवियों के अनुक्रम में हैरिस कोनों को पाता है। मुझे 92 छवियों के लिए ऐसा करने की ज़रूरत है, लेकिन यह धीमी है। इस प्रकार, मैं समानांतर में कोड को चलाने के लिए चाहता हूँ। कोड मैं नीचे है चर "कोनों"MATLAB parfor slicing मुद्दा?

%% Harris corners 
    max_pts = 900; 
    corners = zeros(max_pts,2,size(images,3)); 
    parfor i = 1:size(images,3) 
     I = images(:,:,i); 
     [y x] = get_corners(I,max_pts); 
     corners(1:length(y),:,i) = [y x]; 
    end 

से संबंधित एक त्रुटि जो कहते हैं:

MATLAB समूहों में पाश पुनरावृत्तियों को विभाजित, और फिर उन्हें MATLAB कार्यकर्ताओं को भेजकर parfor कार्यों में छोरों चलाता है जहां वे समानांतर में भागते हैं। MATLAB को दोहराने योग्य, विश्वसनीय तरीके से करने के लिए, यह लूप में उपयोग किए गए सभी चर वर्गीकृत करने में सक्षम होना चाहिए। कोड संकेतित चर का उपयोग इस तरह से करता है जो वर्गीकरण के साथ असंगत है। सुझाए गए क्रिया संकेतित चर के उपयोग को ठीक करें। चरम वर्गीकरण और पारदर्शी लूप पुनरावृत्तियों पर अन्य प्रतिबंधों के बारे में अधिक जानकारी के लिए, समानांतर कंप्यूटिंग टूलबॉक्स दस्तावेज़ में "चर का वर्गीकरण" देखें।

कोई विचार यह कैसे ठीक करें?

धन्यवाद!

उत्तर

7

@Chris से उल्लेख किया है, लाइन

corners(1:length(y),:,i) = [y x]; 

समस्या है। एक आसान तरीका है यकीन है कि कोनों बनाने के लिए sliceable है एक सेल सरणी

max_pts = 900; 
cornerCell = cell(size(images,3),1); 
parfor i = 1:size(images,3) 
    I = images(:,:,i); 
    [y x] = get_corners(I,max_pts); 
    cornerCell{i} = [y x]; 
end 

उपयोग करने के लिए आप एक सेल सरणी होने के लिए कोनों नहीं करना चाहते हैं है (कि ith छवि के लिए कोनों प्लॉट करने के लिए ध्यान दें, आप imshow(images(:,:,i),[]),hold on, plot(cornerCell{i}(:,1),cornerCell{i}(:,2),'o') कॉल कर सकते हैं) , तो आप हमेशा एक पाश में अपने मूल 900-दर-2-दर-nImages सरणी के लिए वापस परिवर्तित कर सकते हैं कि आप किसी भी ध्यान देने योग्य समय खर्च नहीं होगा:

corners = zeros(max_pts,2,size(images,3)); 
for i=1:size(images,3) 
    corners(1:size(cornerCell{i},1),:,i) = cornerCell{i}; 
end 
+0

यह सरणी के लिए एन आयाम को यह विस्तार करने के लिए संभव है इमेजिस?मान लें कि आप एमएच आयाम पर टुकड़ा करने के लिए फ़ंक्शन को निर्दिष्ट करते हैं ताकि आपको छवि (:,:, 1,1,1,1,:, 1,1,1) मिल जाए जहां तीसरा कॉलन एमएच स्थिति पर है। – Leo

+1

@ लियो: कोई स्लाइसिंग हमेशा अंतिम आयाम के साथ नहीं रहेगी। हालांकि, 'परमिट' के साथ, आप आवश्यकतानुसार आयामों को स्थानांतरित कर सकते हैं। – Jonas

2

सबसे पहले:

corners(1:length(y),:,i) = [y x]; 

समस्या लाइन है।

क्या आपने प्रलेखन पढ़ा था?

http://www.mathworks.com/help/toolbox/distcomp/brdqtjj-1.html#bq_tcng-1 सरणी के

आकार - एक कटा हुआ चर को असाइन करने के लिए, काम के दाएँ हाथ की ओर नहीं [] या '' (इन ऑपरेटरों तत्वों का विलोपन से संकेत मिलता है) है।

ऐरे का आकार। एक कटा हुआ चर एक निरंतर आकार बनाए रखना चाहिए। किसी भी रेखा पर दिखाए गए परिवर्तनीय ए को कटा हुआ नहीं किया गया है:

ए (i, :) = []; ए (अंत + 1) = i;

कारण ए किसी भी मामले में कटा हुआ नहीं है क्योंकि एक कटा हुआ सरणी के आकार को बदलने से ग्राहक और श्रमिकों के बीच संचार को नियंत्रित करने वाली मान्यताओं का उल्लंघन होगा।

मुझे एक्स और वाई के लिए अच्छा अनुभव नहीं है, लेकिन अब यह स्पष्ट होना चाहिए कि समस्या क्या है। क्या आप इसे फिर से लिख सकते हैं ताकि आप स्लाइस को [] असाइन नहीं कर रहे हों?