2010-11-01 14 views
9

मैं अंतर्निहित लूप के साथ एक पंक्ति पर एक सरणी प्रारंभ करना चाहता हूं। हालांकि, मुझे हमेशा एक वाक्यविन्यास या आकार त्रुटि मिलती है। क्या कोई मुझे निम्नलिखित निर्माण को सही करने में मदद कर सकता है?इम्प्लीट डू लूप सरणी प्रारंभ

integer myarray :: (maxdim, nr) 

myarray(1:maxdim,nr) = (/ (/i,i=1,maxdim/),nr /) 

उत्तर

16

आप MAXDIM पंक्तियों और NR कॉलम के साथ एक सरणी प्रारंभ कर रहे हैं, और ऐसा लगता है कि प्रत्येक कॉलम में पूर्णांक 1 से MAXDIM होता है।

पहले कदम के रूप, आगे जाना है और वास्तविक DO -loop लिखने:

do j = 1,NR 
    myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /) 
end do 

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

do j=1,NR 
    do i=1,MAXDIM 
     myarray(i,j) = i 
    end do 
end do 

एक अंतर्निहित पाश संरचना करने के लिए भीतरी पाश को संकुचित करें बाहरी पाश, हालांकि, कुछ अजीब होता है:

myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /) 

अब, मैं एक इंक मिल असम्बद्ध रैंक त्रुटि जैसा आपने किया था।

print *, shape(myarray) 
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)) 

यह बाहर प्रिंट

5  10 
    50 

सरणी निर्माता बस विस्तार हो रहा है: जब से मैं या तो निहित do-छोरों पर बहुत अच्छा नहीं हूँ, मैं सरणी निर्माता के लिए shape आंतरिक परिणामों को देखा एक 1-डी सरणी, किसी नेस्टेड सरणी निर्माण flattening। सरल बनाने के लिए हम वास्तव में (/ /) के दूसरे सेट को छोड़ सकते हैं। चूंकि सब कुछ पहले से ही उचित क्रम में है, इसलिए हम उचित रैंक सुनिश्चित करने के लिए reshape आंतरिक का उपयोग कर सकते हैं। मेरा पूरा परीक्षण कार्यक्रम तो है:, j = 1

program sotest 
    implicit none 

    integer, parameter :: MAXDIM = 5 
    integer, parameter :: NR  = 10 

    integer :: i 
    integer :: j 
    integer :: myarray(MAXDIM, NR) 
    integer :: myarray_implicit(MAXDIM, NR) 

    do j = 1,NR 
     do i = 1,MAXDIM 
      myarray(i,j) = i 
     end do 
    end do 

    myarray_implicit = reshape((/ ((i,i=1,MAXDIM), j=1,NR) /), (/ MAXDIM, NR /)) 

    print *, all(myarray == myarray_implicit) 
end program sotest 
+7

ध्यान दें कि यह भी 'myarray_implicit = आकृति बदलें ((/ ((मैं लिखने के लिए मान्य है, मैं = 1, MAXDIM), एन.आर.) /), आकार (myarray_implicit)) ' स्पष्ट रूप से अपने मैट्रिक्स के आयामों को टाइप करने से बचने के लिए। – Markus

6

निहित लूप केवल एक वेक्टर बना देगा ताकि आपको इसे फिर से बदलना पड़े। कुछ इस तरह:

integer, dimension(m,n) :: myarray 
integer :: ix, jx 
... 
myarray = reshape([ (ix, ix = 1, m*n) ], [ m, n ]) 

या शायद आप एक और अधिक जटिल, नेस्ट, निहित करते हैं पाश हैं:

myarray = reshape([ ((ix+jx, ix = 1, m), jx = 1, n) ], [ m, n ]) 

ध्यान दें कि मैं [ ] की Fortran2003 सम्मेलन का उपयोग कर रहा सरणी निर्माण परिसीमित करने के लिए, बल्कि (/ /) से अधिक। ध्यान दें कि आपको अंतर्निहित डू लूप इंडेक्स चर घोषित करना होगा।

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