2010-09-14 13 views
22

में दो आयामी सरणी प्रारंभ करने में सी में आप आसानी से घुंघराले ब्रेसिज़ सिंटैक्स का उपयोग एक सरणी को प्रारंभ कर सकते हैं, अगर मैं सही ढंग से याद रखें:कैसे फोरट्रान

int* a = new int[] { 1, 2, 3, 4 }; 

आप दो आयामी के लिए फोरट्रान में एक ही कैसे कर सकते सरणी जब आप गणितीय उद्देश्यों के लिए विशिष्ट परीक्षण मानों के साथ एक मैट्रिक्स प्रारंभ करना चाहते हैं?

सरणी या तो परिभाषित किया गया है द्वारा

real, dimension(3, 3) :: a 

या

real, dimension(:), allocatable :: a 

उत्तर

42

(सूचकांक अलग बयान पर हर तत्व दोगुना करने के लिए बिना) आपको लगता है कि reshape और shape intrinsics का उपयोग कर सकते हैं। कुछ ऐसा:

INTEGER, DIMENSION(3, 3) :: array 
array = reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array)) 

लेकिन स्तंभ-प्रमुख आदेश याद रखें। सरणी

1 4 7 
2 5 8 
3 6 9 

रीशेपिंग के बाद होगी।

तो पाने के लिए:

1 2 3 
4 5 6 
7 8 9 

आप भी transpose आंतरिक की जरूरत है:

array = transpose(reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array))) 

अधिक सामान्य उदाहरण (अलग-अलग आयामों के साथ allocatable 2 डी सरणी) के लिए, एक size आंतरिक की जरूरत है:

PROGRAM main 

    IMPLICIT NONE 

    INTEGER, DIMENSION(:, :), ALLOCATABLE :: array 

    ALLOCATE (array(2, 3)) 

    array = transpose(reshape((/ 1, 2, 3, 4, 5, 6 /),       & 
    (/ size(array, 2), size(array, 1) /))) 

    DEALLOCATE (array) 

END PROGRAM main 
+12

1) अधिकांश कंपाइलर्स अब कुछ हद तक अजीब (/ /) के बजाय सरणी शुरू करने के लिए फोरट्रान 2003 नोटेशन [] स्वीकार करते हैं। 2) सरल मामलों के लिए आप कॉलम-प्रमुख क्रम में मान प्रदान करके स्थानांतरित कर सकते हैं: सरणी = reshape ([1, 4, 7, 2, 5, 8, 3, 6, 9], आकार (सरणी)) –

+0

मैं उल्लेख करना भूल गया कि हमें फोरट्रान 9 0 में काम करने की आवश्यकता है। –

4

सरणी प्रारंभिकरण सरणी डी में किया जा सकता है eclaration बयान ही है, जैसा कि नीचे दिखाया:

program test 
real:: x(3) = (/1,2,3/) 
real:: y(3,3) = reshape((/1,2,3,4,5,6,7,8,9/), (/3,3/)) 
integer:: i(3,2,2) = reshape((/1,2,3,4,5,6,7,8,9,10,11,12/), (/3,2,2/)) 

end program test 

यह मुझे आश्चर्य है कि

real:: y(3,3) = (/(/1,2,3/),(/4,5,6/),(/7,8,9/)/) 

नहीं संकलक (कोशिश की G95, gfortran) द्वारा स्वीकार कर लिया है। यह पता चला है कि shape (/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)9 है और 3 3 नहीं है!

13

बहुआयामी के लिए (रैंक> 1) सरणियों, आरंभीकरण के लिए फोरट्रान रास्ता सी समाधान से भिन्न है क्योंकि सी में बहुआयामी सरणियों बस आदि की सरणियों के सरणियों हैं

फोरट्रान में, प्रत्येक पद के लिए एक अलग विशेषता से मेल खाती है संशोधित डेटा प्रकार का। लेकिन रैंक -1 एरे के लिए केवल एक सरणी कन्स्ट्रक्टर है। इन दो कारणों से, सरणी कन्स्ट्रक्टर के माध्यम से प्रारंभिकता RESHAPE इंट्रिसिक फ़ंक्शन की आवश्यकता होती है।

जो पहले से ही उत्तर दिया गया है, इसके अतिरिक्त, कॉलम के बजाय पंक्ति द्वारा मैट्रिक्स के मान को दर्ज करने का एक और सीधा तरीका है: reshape का वैकल्पिक तर्क ORDER है जिसका उपयोग भरने के क्रम को संशोधित करने के लिए किया जा सकता है सरणी कन्स्ट्रक्टर की प्रविष्टियों के साथ बहुआयामी सरणी का तत्व।

उदाहरण के लिए, पहले उत्तर में उदाहरण के मामले में, एक लिख सकते हैं:

INTEGER, DIMENSION(3, 3) :: array=reshape((/ 1, 2, 3, & 
               4, 5, 6, & 
               7, 8, 9 /), & 
              shape(array), order=(/2,1/)) 

वास्तव में कोड की लाइनों द्वारा दिखाए गए क्रम में मैट्रिक्स सरणी के भरने प्राप्त करने।

सरणी (/2, 1/) वांछित प्रभाव देकर पंक्ति सूचकांक (1) पर प्राथमिकता रखने के लिए कॉलम इंडेक्स (2) को बल देता है।

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