दिलचस्प पोस्ट
कार्रवाई बार अतिप्रवाह आइकन दिखाने के लिए कैसे लागू करें एक सेटर के बिना संपत्ति क्यों नहीं धारावाहिक हैं हाइबरनेट ओपन सत्र में क्यों एक बुरा अभ्यास माना जाता है? OpenSubKey () एक रजिस्ट्री कुंजी के लिए रिक्त देता है जिसे मैं regedit.exe में देख सकता हूँ यूटीएफ -8: जनरल? बिन? यूनिकोड? क्या जावास्क्रिप्ट के माध्यम से एक लिंक (या किसी तत्व का) क्लिक करें ईवेंट को ट्रिगर करना संभव है? अजगर की सूची से मूल्य की एक सूची मिल रही है एमएस एक्सेस (एमडीबी) संगामिति मैं git में अगले प्रतिबद्ध कैसे मिल सकता है? डिजिटल फाइलों पर हस्ताक्षर करें तार के लिए पैड शून्य के लिए सबसे आसान तरीका DropDownListFor संपादक में टेम्पलेट मूल्य का चयन नहीं किसी दृश्य के पूर्ण निर्देशांक कैसे प्राप्त करें PHP के साथ एक निर्देशिका में सभी फाइलों के नाम प्राप्त करना छवि शेयर का उद्देश्य जीमेल के लिए काम करता है लेकिन एफबी और ट्विटर को क्रैश करता है

1 डी सरणी पर एक 2 डी सरणी को मैप करें

मैं 1 डी सरणी के साथ 2 डी सरणी का प्रतिनिधित्व करना चाहता हूं। एक फ़ंक्शंस दो indicies (एक्स, वाई) और स्टोर करने के लिए मान देगी। ये दो indicies एक 1 डी सरणी के एक तत्व का प्रतिनिधित्व करेंगे, और उसके अनुसार तदनुसार सेट करेंगे। मुझे पता है 1 डी सरणी को सरणी-चौड़ाई × सरणी का आकार होना चाहिए, लेकिन मुझे नहीं पता कि प्रत्येक तत्व कैसे सेट करना है।

उदाहरण के लिए, मैं (4, 3,3) से (2,4,3) कैसे भेद कर सकता हूं? मैंने एक्स * वाई के रूप में सरणी को सेट करने की कोशिश की, लेकिन 2 * 4 और 4 * 2 के परिणामस्वरूप सरणी में एक ही जगह होगी और मुझे उन्हें अलग-अलग होना चाहिए।

वेब के समाधान से एकत्रित समाधान "1 डी सरणी पर एक 2 डी सरणी को मैप करें"

आपको यह तय करने की आवश्यकता है कि सरणी तत्व पंक्ति आदेश या स्तंभ क्रम में संग्रहीत किए जाएंगे और उसके बाद इसके बारे में सुसंगत रहें। http://en.wikipedia.org/wiki/Row-major_order

सी भाषा बहुआयामी arrays के लिए पंक्ति आदेश का उपयोग करती है

यह एक एकल आयामी सरणी के साथ अनुकरण करने के लिए, आप चौड़ाई से पंक्ति अनुक्रमणिका गुणा करें, और इस प्रकार स्तंभ अनुक्रमणिका को जोड़ दें:

int array[width * height]; int SetElement(int row, int col, int value) { array[width * row + col] = value; } 

उदाहरण: हम SIZE_X और SIZE_Y आकार के 2 डी सरणी का प्रतिनिधित्व करना चाहते हैं। इसका अर्थ है कि हमारे पास MAXX आकार की अधिकतम लगातार पंक्तियां होंगी। इसलिए सेट फ़ंक्शन है

 void set_array( int x, int y, int val ) { array[ x * SIZE_Y + y ] = val; } 

प्राप्त होगा:

 int get_array( int x, int y ) { return array[ x * SIZE_Y + y ]; } 

1 डी सरणी अनुक्रमणिका में 2 डी सरणी सूचकांक के पुनर्गणना के लिए विशिष्ट सूत्र है

 index = indexX * arrayWidth + indexY; 

वैकल्पिक रूप से आप उपयोग कर सकते हैं

 index = indexY * arrayHeight + indexX; 

(यह मानते हुए कि arrayWidth को एक्स अक्ष के साथ मापा जाता है, और वाई अक्ष के साथ arrayHeight )

बेशक, एक कई अलग-अलग फ़ार्मुलों के साथ आ सकता है जो वैकल्पिक अद्वितीय मैपिंग प्रदान करते हैं, लेकिन आम तौर पर इसमें कोई आवश्यकता नहीं होती है

सी / सी ++ भाषाओं में अंतर्निहित बहुआयामी arrays को स्मृति में संग्रहीत किया जाता है ताकि अंतिम सूचकांक सबसे तेजी से बदल जाए, जिसका अर्थ है कि एक सरणी के लिए घोषित

 int xy[10][10]; 

तत्व xy[5][3] तुरंत स्मृति में xy[5][4] द्वारा पीछा किया जाता है आप उस सम्मेलन का अनुसरण करना चाह सकते हैं, ऊपर दिए गए दो सूत्रों में से एक को चुनकर, जिस पर आप इंडेक्स (एक्स या वाई) के बारे में सोचते हैं, दो का "अंतिम" माना जाता है।

जैसा कि दूसरे ने सी क्रम में सी नक्शे कहा है

  #include <stdio.h> int main(int argc, char **argv) { int i, j, k; int arr[5][3]; int *arr2 = (int*)arr; for (k=0; k<15; k++) { arr2[k] = k; printf("arr[%d] = %2d\n", k, arr2[k]); } for (i=0; i<5; i++) { for (j=0; j< 3; j++) { printf("arr2[%d][%d] = %2d\n", i, j ,arr[i][j]); } } } 

आउटपुट:

 arr[0] = 0 arr[1] = 1 arr[2] = 2 arr[3] = 3 arr[4] = 4 arr[5] = 5 arr[6] = 6 arr[7] = 7 arr[8] = 8 arr[9] = 9 arr[10] = 10 arr[11] = 11 arr[12] = 12 arr[13] = 13 arr[14] = 14 arr2[0][0] = 0 arr2[0][1] = 1 arr2[0][2] = 2 arr2[1][0] = 3 arr2[1][1] = 4 arr2[1][2] = 5 arr2[2][0] = 6 arr2[2][1] = 7 arr2[2][2] = 8 arr2[3][0] = 9 arr2[3][1] = 10 arr2[3][2] = 11 arr2[4][0] = 12 arr2[4][1] = 13 arr2[4][2] = 14 

पंक्ति प्रमुख उदाहरण का उपयोग कर:

 A(i,j) = a[i + j*ld]; // where ld is the leading dimension // (commonly same as array dimension in i) // matrix like notation using preprocessor hack, allows to hide indexing #define A(i,j) A[(i) + (j)*ld] double *A = ...; size_t ld = ...; A(i,j) = ...; ... = A(j,i); 

डेटा को ऐसे तरीके से संगृहीत करना महत्वपूर्ण है जिसे इसे इस्तेमाल की जाने वाली भाषाओं में पुनः प्राप्त किया जा सकता है। पंक्ति-प्रमुख क्रम में सी-भाषा के स्टोर (पहली पंक्ति पहले आती है, फिर दूसरी पंक्ति के सभी …) हर सूचकांक के साथ 0 से उसके पास आयाम-1 है। तो एक्स [2] [3] एक्स [0] [0], एक्स [0] [1], एक्स [0] [2], एक्स [1] [0], एक्स [1] [x] [x] 1], एक्स [1] [2] तो सी भाषा में, एक्स [i] [जे] को उसी स्थान को 1-आयामी सरणी प्रविष्टि x1dim [i * 3 + j] के रूप में संग्रहीत किया जाता है। यदि इस तरह से डेटा संग्रहीत किया जाता है, तो सी भाषा में पुनः प्राप्त करना आसान है।

फोरट्रान और MATLAB अलग हैं वे कॉलम-प्रमुख क्रम में स्टोर करते हैं (पहले कॉलम पहले आता है, फिर दूसरी पंक्ति, …) और हर सूचकांक 1 से लेकर उसके आयाम तक चलता है। तो सूचकांक क्रम सी के पीछे है और सभी सूचकांक 1 बड़ा है। यदि आप सी भाषा क्रम में डेटा संग्रहीत करते हैं, तो फोरट्रान X_FORTRAN (j + 1, i + 1) का उपयोग करते हुए X_C_language [i] [j] पा सकते हैं। उदाहरण के लिए, X_C_language [1] [2] X_FORTRAN (3, 2) के बराबर है। 1-आयामी arrays में, उस डेटा का मान X1dim_C_language [2 * Cdim2 + 3] पर है, जो कि X1dim_FORTRAN (2 * Fdim1 + 3 + 1) के समान स्थान है। याद रखें कि Cdim2 = Fdim1 क्योंकि सूचकांक का क्रम उलट है।

MATLAB फ़ॉरट्रान के समान है एडीए सी के समान है, सिवाय इंडेक्स सामान्यतः 1 से शुरू होता है। किसी भी भाषा में उन सी या फोरट्रान ऑर्डर में से एक में इंडेक्स होंगे और सूचकांक 0 या 1 से शुरू हो जाएंगे और तदनुसार संग्रहीत डेटा प्राप्त करने के लिए समायोजित किया जा सकता है।

क्षमा करें यदि यह स्पष्टीकरण भ्रामक है, लेकिन मुझे लगता है कि प्रोग्रामर को जानने के लिए यह सही और महत्वपूर्ण है।

आप एक साधारण सूचक के साथ जगह में 2d सरणी का उपयोग करने में सक्षम होना चाहिए। सरणी [x] [y] पी [0x * चौड़ाई + 0y] [0x * चौड़ाई + 1]] [0x * चौड़ाई + एन-1]] [1x * चौड़ाई + 0y] आदि के रूप में सूचक में व्यवस्था की जाएगी। ।