2012-11-15 16 views
9

को वेक्टरिज़ कैसे करें मुझे इस लूप के सेट को सदिश करने के तरीके को देखने में परेशानी हो रही है। किसी भी मार्गदर्शन की सराहना की जाएगी।एक नेस्टेड लूप

ind_1 = [1,2,3]; 
ind_2 = [1,2,4]; 
K = zeros(3,3,3,3,3,3,3,3,3); 
pp = rand(4,4,4); 

for s = 1:3 
for t = 1:3 
    for k = 1:3 
    for l = 1:3 
    for m = 1:3 
    for n = 1:3 
     for o = 1:3 
     for p = 1:3 
     for r = 1:3 
     % the following loops are singular valued except when 
     % y=3 for ind_x(y) in this case 
     for a_s = ind_1(s):ind_2(s) 
      for a_t = ind_1(t):ind_2(t) 
      for a_k = ind_1(k):ind_2(k) 
      for a_l = ind_1(l):ind_2(l) 
      for a_m = ind_1(m):ind_2(m) 
       for a_n = ind_1(n):ind_2(n) 
       for a_o = ind_1(o):ind_2(o) 
       for a_p = ind_1(p):ind_2(p) 
       for a_r = ind_1(r):ind_2(r) 
        K(s,t,k,l,m,n,o,p,r) = K(s,t,k,l,m,n,o,p,r) + ... 
        pp(a_s, a_t, a_r) * pp(a_k, a_l, a_r) * ... 
        pp(a_n, a_m, a_s) * pp(a_o, a_n, a_t) * ... 
        pp(a_p, a_o, a_k) * pp(a_m, a_p, a_l); 
       end 
       end 
       end 
       end 
      end 
      end 
      end 
      end 
     end 
     end 
     end 
     end 
    end 
    end 
    end 
    end 
end 
end 

संपादित करें:

कोड, प्रत्येक सूचकांक के लिए pp रों एक या दो बार के एक उत्पाद के मूल्यों संक्षेप द्वारा 1 से 3 सूचकांक के साथ एक रैंक-9 टेन्सर पैदा कर रही है मूल्य के आधार पर ind_1 और ind_2 का।

संपादित करें:

यहाँ एक 3 डी उदाहरण है, हालांकि ध्यान भालू तथ्य यह है कि pp के सूचकांकों बस permuted रहे 9d संस्करण में संरक्षित नहीं किया जाता है कि:

ind_1 = [1,2,3]; 
ind_2 = [1,2,4]; 
K = zeros(3,3,3); 
pp = rand(4,4,4); 

for s = 1:3 
for t = 1:3 
    for k = 1:3 
    % the following loops are singular valued except when 
    % y=3 for ind_x(y) in this case 
    for a_s = ind_1(s):ind_2(s) 
    for a_t = ind_1(t):ind_2(t) 
    for a_k = ind_1(k):ind_2(k) 
     K(s,t,k) = K(s,t,k) + ... 
     pp(a_s, a_t, a_r) * pp(a_t, a_s, a_k) * ... 
     pp(a_k, a_t, a_s) * pp(a_k, a_s, a_t); 
    end 
    end 
    end 
    end 
end 
end 
+0

क्या आप इस कोड को क्या कर रहे हैं और टिप्पणियां जोड़ने पर थोड़ा सा विस्तार कर सकते हैं? – igon

+0

@igon: मैंने संपादित किया है। – erbridge

+0

क्या आप चित्रित करने के लिए 2 डी या 3 डी उदाहरण बना सकते हैं? हमारे साथ काम करना आसान होगा, और उदाहरण बनाने से आप अपनी रणनीति तैयार कर सकते हैं। – tmpearce

उत्तर

5

वो! बहुत आसान समाधान, लेकिन खोजने के लिए आसान नहीं था। वैसे मुझे आश्चर्य है कि आपका फॉर्मूला कहां से आता है।

यदि आपको अस्थायी रूप से थोड़ी मेमोरी खोना नहीं है (2 बार 4^9 सरणी बनाम 3^9 पहले), तो आप अंत में तीसरे और चौथे हाइपरप्लेन्स के संचय को रोक सकते हैं।

एक यूनिक्स बॉक्स पर सप्तक 3.2.4 के साथ

परीक्षण, यह 23s (67Mb)0.17s (98Mb) करने से चला जाता है।

function K = tensor9_opt(pp) 

    ppp = repmat(pp, [1 1 1 4 4 4 4 4 4]) ; 
    % The 3 first numbers are variable indices (eg 1 for a_s to 9 for a_r) 
    % Other numbers must complete 1:9 indices in any order 
    T = ipermute(ppp, [1 2 9 3 4 5 6 7 8]) .* ... 
     ipermute(ppp, [3 4 9 1 2 5 6 7 8]) .* ... 
     ipermute(ppp, [6 5 1 2 3 4 7 8 9]) .* ... 
     ipermute(ppp, [7 6 2 1 3 4 5 8 9]) .* ... 
     ipermute(ppp, [8 7 3 1 2 4 5 6 9]) .* ... 
     ipermute(ppp, [5 8 4 1 2 3 6 7 9]) ; 

    % I have not found how to manipulate 'multi-ranges' programmatically. 
    T1 = T (:,:,:,:,:,:,:,:,1:end-1) ; T1(:,:,:,:,:,:,:,:,end) += T (:,:,:,:,:,:,:,:,end) ; 
    T = T1(:,:,:,:,:,:,:,1:end-1,:) ; T (:,:,:,:,:,:,:,end,:) += T1(:,:,:,:,:,:,:,end,:) ; 
    T1 = T (:,:,:,:,:,:,1:end-1,:,:) ; T1(:,:,:,:,:,:,end,:,:) += T (:,:,:,:,:,:,end,:,:) ; 
    T = T1(:,:,:,:,:,1:end-1,:,:,:) ; T (:,:,:,:,:,end,:,:,:) += T1(:,:,:,:,:,end,:,:,:) ; 
    T1 = T (:,:,:,:,1:end-1,:,:,:,:) ; T1(:,:,:,:,end,:,:,:,:) += T (:,:,:,:,end,:,:,:,:) ; 
    T = T1(:,:,:,1:end-1,:,:,:,:,:) ; T (:,:,:,end,:,:,:,:,:) += T1(:,:,:,end,:,:,:,:,:) ; 
    T1 = T (:,:,1:end-1,:,:,:,:,:,:) ; T1(:,:,end,:,:,:,:,:,:) += T (:,:,end,:,:,:,:,:,:) ; 
    T = T1(:,1:end-1,:,:,:,:,:,:,:) ; T (:,end,:,:,:,:,:,:,:) += T1(:,end,:,:,:,:,:,:,:) ; 
    K = T (1:end-1,:,:,:,:,:,:,:,:) ; K (end,:,:,:,:,:,:,:,:) += T (end,:,:,:,:,:,:,:,:) ; 
endfunction 

pp = rand(4,4,4); 
K = tensor9_opt(pp) ; 
+0

उत्कृष्ट। धन्यवाद। – erbridge

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