2014-10-02 25 views
6

मैं हाल ही में एक पिछले question मेरे द्वारा पूछे गए एक "सरल" नेस्टेड लूप vectorize करने के लिए कैसे सीखा है पर निर्भर करता है vectorizing। j और k शर्तों (यानी B(j)*((k-1>0)+1) के संयोजन एक त्रिकोणीय देता है: हालांकि, अब मैं निम्नलिखित पाशएक नेस्टेड लूप जहां एक पाश चर अन्य

A=rand(80,80,10,6,8,8); 

I=rand(size(A1,3),1); 
C=rand(size(A1,4),1); 
B=rand(size(A1,5),1); 

for i=1:numel(I) 
    for v=1:numel(C) 
     for j=1:numel(B) 
      for k=1:j 
       A(:,:,i,v,j,k)= A(:,:,i,v,j,k)*I(i)*C(v)*B(j)*((k-1>0)+1);    
      end 
     end 
    end 
end 

तो अब kj में निर्भर करता है ... मैं अब तक क्या कोशिश की है vectorize करने के लिए भी कोशिश कर रहा हूँ मैट्रिक्स है कि मैं स्वतंत्र रूप से vectorize के लिए प्रबंधन:।

B2=tril([ones(8,1)*B']'); 
    B2(2:end,2:end)=2*B2(2:end,2:end); 

लेकिन है कि मुझे (जे, ट) मैट्रिक्स को सही ढंग से शेष पाश vectorize के लिए इसका इस्तेमाल करने के लिए एक रास्ता देती है शायद मैं भी गलत रास्ते में हूँ। .. तो मैं उस प्रकार के लूप को सदिश कैसे बना सकता हूं?

उत्तर

11

करने के लिए one of your comments में पिछले प्रश्न के स्वीकार किए जाते हैं समाधान, आप उल्लेख किया है कि लगातार bsxfun(@times,..,permute..) आधारित कोड तेजी से थे। यदि ऐसा है, तो आप यहां भी इसी तरह के दृष्टिकोण का उपयोग कर सकते हैं।

B1 = tril(bsxfun(@times,B,[1 ones(1,numel(B)-1).*2])); 
v1 = bsxfun(@times,B1, permute(C,[3 2 1])); 
v2 = bsxfun(@times,v1, permute(I,[4 3 2 1])); 
A = bsxfun(@times,A, permute(v2,[5 6 4 3 1 2])); 
+0

अद्भुत - यहाँ कोड tril के साथ-साथ इस तरह के एक पैटर्न का उपयोग करता है है! यह बहुत अधिक सुरुचिपूर्ण है और @ नतन के समाधान से 25% तेज है। – Max

+0

@ मैक्स बहुत बढ़िया! यह भी जानना अच्छा है! – Divakar

+6

यह समाधान मेरे [रामानुजन] याद दिलाता है (https://en.wikipedia.org/wiki/Srinivasa_Ramanujan)। मुझे बिल्कुल पता नहीं है कि आप उस जवाब के साथ कैसे नरक में आए थे। – rayryeng

2

आप करीब थे। vectorization आप वास्तव में प्रस्तावित (जे, ट) तर्क इस प्रकार है, लेकिन tril कर स्थानों पर जहां पाश में जाने नहीं करता है में शून्य कहते हैं। अपने पिछले प्रश्न के लिए समाधान (@ डेविड के) का उपयोग करना पूर्ण रूप में यह इन शून्य मान तत्वों कि पाश में जाने नहीं करता सहित सभी तत्वों गुणा नहीं है।

अपने कोड के साथ शुरू::

B2=tril([ones(8,1)*B']'); 
B2(2:end,2:end)=2*B2(2:end,2:end); 

और vectorization पिछले प्रश्न में दिखाया गया है निम्नलिखित:

कि मेरे समाधान, इन शून्य तत्व खोजने के लिए और उन लोगों के साथ 1 (इतना आसान) को बदलने के लिए है
s=size(A); 
[b,c,d]=ndgrid(I,C,B2); 
F=b.*c.*d; 
F(F==0)=1; % this is the step that is important for your case. 
A=reshape(A,s(1),s(2),[]); 
A=bsxfun(@times,A,permute(F(:),[3 2 1])); 
A=reshape(A,s); 

प्रश्न में प्रयोग किया जाता A का आकार इस कटौती रन टाइम, बुरा नहीं का लगभग 50% के लिए ...