दिलचस्प पोस्ट
बिटमैप लोड करते समय मेमोरी त्रुटि से बाहर कार्यक्रमों को देखने के लिए दृश्य कैसे जोड़ें डेल्टाइप (ऑटो) के कुछ उपयोग क्या हैं? numpy.array .__ iadd__ और दोहराया सूचकांक MySQL अद्यतन एक जुड़ती हुई तालिका SQL सर्वर में एकल उद्धरण बदलें ऑपरेटर = और फ़ंक्शन जो सी ++ में विरासत में नहीं हैं? मोबाइल उपकरणों पर सीएसएस होवर काम करता है? PHP को अपग्रेड करने के बाद मैं mysql_ * फ़ंक्शन का उपयोग नहीं कर सकता कई शर्तों को फ़िल्टर करें dplyr Jquery में ड्रॉपडाउन बॉक्स को सक्षम / अक्षम करें बंद करने के बारे में, लेक्सिकल पर्यावरण और जीसी विंडोज पर एफसीएनटीएल विकल्प कॉलम नाम वाले वेरिएबल के आधार पर विभिन्न कॉलम से मान चुनें चारों ओर तर्कों की चर संख्या पास करना

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

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

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

Solutions Collecting From Web of "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] आदि के रूप में सूचक में व्यवस्था की जाएगी। ।