2013-03-22 11 views
7

क्या किसी को पता है कि मैटलैब में parfor का उपयोग करके इस सरल कोड में क्या चल रहा है? धन्यवाद,Matlab parfor loop अनुक्रमण

मैं चार विन्यास में, एक मैट्रिक्स कटा हुआ है और स्वतंत्र रूप से

यहाँ एक सरल संस्करण है प्रत्येक सरणी में तत्वों को अपडेट करना चाहते हैं: के लिए 'एक' प्रतिबंधित कर रहे हैं वैध सूचकांक:

a = zeros(4,4); 
parfor i = 1:4 
    j = 2;  
    a(j,i) = 3; 
end 

त्रुटि पार्स लूप में;

हालांकि,

इस काम करता है:

a = zeros(4,4); 
parfor i = 1:4 
    a(2,i) = 3; 
end 

एक ही त्रुटि के साथ एक और सरल nonworking संस्करण:

a = zeros(4,4); 
parfor i = 1:4 
    a(i,i) = 3; 
end 
अपने आवेदन में

, सूचकांक जे कुछ के माध्यम से एक सरणी के लिए स्वतंत्र रूप से उत्पन्न होता है एल्गोरिदम

+1

ऐसा लगता है कि आप लूप के अंदर अन्य इंडेक्स चर सेट नहीं कर सकते हैं। देखें: http://www.mathworks.com/matlabcentral/newsreader/view_thread/162203 – cyang

+0

मैटलैब का कौन सा संस्करण आप उपयोग कर रहे हैं? – alrikai

+0

हालांकि मेरे पास MATLAB के मेरे संस्करण में नहीं है, मुझे लगता है कि यह 'parpool' - http://www.mathworks.it/it/help/distcomp/parpool.html –

उत्तर

1

जो आप प्राप्त करने की कोशिश कर रहे हैं संभव नहीं है।

matlab प्रलेखन के अनुसार:

When you use other variables along with the loop variable to index an array, you cannot set these variables inside the loop. In effect, such variables are constant over the execution of the entire parfor statement. You cannot combine the loop variable with itself to form an index expression.

MATLAB Documentation Source

तो सभी चर आप अनुक्रमणिका में अपने सरणी, पाश चर के अलावा अन्य का उपयोग पूरे पाश के लिए निरंतर रहना होगा।

+0

पर देखने के लिए योग्य है। मैंने देखा कि एक 2 डी सरणी को इंडेक्स करने के लिए एक पैर के भीतर लूप के लिए घोंसला करना संभव है। "फॉर" लूप वैरिएबल, उदाहरण के लिए: j = 1: 4 {a (i, j) = ..} के लिए parfor loop में बदल सकता है: i = 1: 4 {} के लिए। ऐसा लगता है जब तक कि जे सभी समान प्रभावों के लिए समान है, यह सुरक्षित है। असल में, मैंने इसे दस्तावेज़ में पाया है जिसे आप संदर्भित करते हैं: "फिक्स्ड इंडेक्स लिस्टिंग - प्रथम-स्तर के कंस्ट्रैसिस या ब्रेसिज़ के भीतर, इंडेक्स की सूची किसी दिए गए चर (कटा हुआ चर) की सभी घटनाओं के लिए समान है"। –

2

बस मेरे दो सेंट: जैसा कि @mmumbos पहले ही समझाया गया है, आप जो हासिल करने की कोशिश कर रहे हैं, वह इस तरह से संभव नहीं है, लेकिन कुछ कामकाज अभी भी लागू हो सकते हैं।

के आप निम्नलिखित की तरह कुछ (जो मैट्रिक्स A की एक रेखीय परिवर्तन की क्रमचय है) लागू करने की आवश्यकता मान लेते हैं:

n=10; 
A=rand(n,n); 
B=zeros(n,n); 
parfor i=1:n, 
    j=(i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5)); 
    B(j,i) = my_function(A(i,:)); 
end 

बजाय प्रयास करें निम्नलिखित:

parfor i=1:n, 
    B_temp(i,:) = my_function(A(i,:)); 
end 

उसके बाद, आप वास्तव में मैट्रिक्स B बनाने की आवश्यकता नहीं है; आप एक '' सूचकांक तालिका '' जो केवल निम्न प्रकार से बनाया जाता है का उपयोग कर इसे B_temp का उपयोग कर पहुँच सकते हैं:

J=zeros(n,1); 
parfor i=1:n, 
    J(i) = (i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5)); 
end 

फिर B(i)B_temp(J(i)) के माध्यम से पहुँचा जा सकता है। वें A के विकर्ण तत्व है, तो आप का उपयोग - तो जब भी आप '' मैं '' का उपयोग करने की जरूरत है

n=4; 
diag_A = zeros(n,1); 
parfor i=1:n, 
    diag_A(i)=3; % or any function of i 
end 

,:

अपने पिछले (काउंटर) उदाहरण रिविजिटिंग, चलो आप इसे कैसे काम कर सकते हैं देखते हैं इसके बजाय diag_A(i)।इस तरह के मामलों के लिए यह निम्नलिखित लाइनों के साथ एक समारोह बनाने के लिए सुविधाजनक है:

function a = access_matrix(A, diag_A, i, j) 
    if (i!=j), 
    a = A(i,j); 
    else 
    a = diag_A(i); 
    end 
end 

तक MATLAB parfor के कार्यान्वयन में सुधार करता है, इस तरह के समाधान होगा (दुर्भाग्य से) आवश्यक मामलों की बहुत सारी में हो।

+0

'B_temp' बनाने के लिए प्रयुक्त कोड का आपका दूसरा भाग Matlab (R2016a) में एक त्रुटि का कारण बनता है। –

+0

@ErikM बहुत बहुत धन्यवाद - आपको वास्तव में एक टाइपो मिला। बाएं हाथ की तरफ 'B_temp (i, :) 'के बजाय' B_temp (i, :) 'होना चाहिए था –

0

चूंकि इसका अभी तक उल्लेख नहीं किया गया है, यहां एक लिंक है जो इन प्रकार के मुद्दों का निदान करने में वास्तव में सहायक है: Classification of Variables in Parfor। ये समस्या तब उत्पन्न होती है जब MATLAB चरम परिभाषाओं में चर को वर्गीकृत नहीं कर सकता है, जो उस पृष्ठ पर उल्लिखित है।

यहां क्या हो रहा है यह है कि यह नहीं जानता कि लूप से पहले "स्लाइस वेरिएबल" ए को कैसे टुकड़ा करना है। समांतर कार्यान्वयन को प्रोग्रामिंग के बारे में सोचें। आप जो करना चाहते हैं वह कट-अप ए भी टुकड़ों में है जो आप जानते हैं कि अन्य प्रोसेसर स्पर्श नहीं करेंगे, और फिर उन्हें अलग-अलग CPUs को अलग-अलग कार्य करने के लिए दें। MATLAB आपके लूप को देखता है और यह नहीं जानता कि यह कैसे करें क्योंकि यह नहीं जानता कि जे प्रोग्राम क्या चल रहा है जब तक यह नहीं है। यह MATLAB की एक सीमा है। एक और मामला जहां एक ही चीज होती है यदि आप ए (i * j, :) जैसे जटिल गुणांक का उपयोग करते हैं। एक बार फिर यह नहीं जानता कि इसे कैसे विभाजित किया जाए।