1 डी डेटा संरचना को 2 डी ग्रिड के रूप में व्यवहार करना


48

मैं एक मूल वर्ग के साथ काम कर रहा हूं जो 1 डी सरणी के रूप में 2 डी छवि का प्रतिनिधित्व करता है। यदि आप एक पिक्सेल बदलना चाहते हैं, उदाहरण के लिए, अब आपको x,yनिर्देशांक से सूचकांक को प्राप्त करने की आवश्यकता है।

तो, मान लें कि हमारे पास array1dइस तरह 1D सरणी है:

array1d = [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y ]

हमारे कार्यक्रम के संदर्भ में, array1dएक 2D ग्रिड का प्रतिनिधित्व करता है:

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

और हम array1dइस तरह से संचालन करना चाहते हैं :

  • x,yनिर्देशांक पर मूल्य प्राप्त करें (इस उदाहरण में, 1,2देगा l)
  • किसी भी उप-ग्रिड का उपयोग करें x,y,width,height( 1,2,2,2दे देंगे [l, m, q, r])
  • किसी भी x,yसमन्वय पर मूल्य निर्धारित करें (आदि)

हम ये कैसे करते हैं?


मतलाब में, और इस प्रकार संभावित गणित प्रकार (जो सीएस में फैलता है), एक मैट्रिक्स को दूसरे में बदलने के लिए (जैसा कि 1x12 एक 2x6 में या 2x6 को 3x4 में) "reshaping" mathworks.com/help/matlab/ के

@ मिचेल्ट: ओपी ग्रिड को नया आकार नहीं दे रहा है। 5x5 को किसी और चीज़ में बदलने का कोई उल्लेख नहीं है (जो वैसे भी समझ में नहीं आएगा)। :)
आईएब्रेट

@ इस सवाल का सार हालांकि संशोधन 1 में था

जवाबों:


86

2D / 1D - मैपिंग बहुत सरल है। X और y, और 2D सरणी आकार width(x- दिशा के लिए) और height(y-दिशा के लिए) को देखते हुए, आप i1D स्थान (शून्य-आधारित) के अनुसार सूचकांक की गणना कर सकते हैं

i = x + width*y;

और रिवर्स ऑपरेशन है

x = i % width;    // % is the "modulo operator", the remainder of i / width;
y = i / width;    // where "/" is an integer division

आप इसे आसानी से 3 या अधिक आयामों तक बढ़ा सकते हैं। उदाहरण के लिए, आयाम "चौड़ाई", "ऊंचाई" और "गहराई" के साथ 3 डी मैट्रिक्स के लिए:

i = x + width*y + width*height*z;

और रिवर्स:

x = i % width;
y = (i / width)%height;
z = i / (width*height);

@ वाशबर्न यह करने का पारंपरिक तरीका है, इसे स्टैटिक 2 डी सरणियों के लिए कंपाइलरों में भी बनाया गया है
शाफ़्ट फ्रीक

@ मैटोस्ट: मुझे ऐसा नहीं लगता, इसका मूल पूर्णांक गणित है।
डॉक्टर ब्राउन

यह उदाहरण 3 डी के लिए गलत है। गणना में गहराई शब्द ऊंचाई होना चाहिए।
जिग्गंजर

@ जिगगंजर: सुधार के लिए धन्यवाद, मेरे हिसाब से अपना जवाब बदल दिया।
डॉक्टर ब्राउन

1
@ ममाकस: कि एक अभ्यास पाठक के लिए छोड़ दिया है ;-)। संकेत: आपको सही जगह पर एक ऑफसेट के रूप में निचली सीमा को जोड़ना / घटाना है। लेकिन इससे पहले कि आप यह कोशिश करें, अपने आप को स्पष्ट करें कि आपके दो अर्थों में से कौन सा 1 डी या 2 डी सरणी है।
डॉक ब्राउन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.