1D অ্যারেতে 2D অ্যারে মানচিত্র করুন


91

আমি 1D অ্যারে সহ 2D অ্যারে উপস্থাপন করতে চাই। একটি ফাংশন দুটি সূচক (x, y) এবং সংরক্ষণের মানটি পাস করবে। এই দুটি সূচকটি 1D অ্যারের একক উপাদানকে উপস্থাপন করবে এবং সেই অনুযায়ী সেট করবে। আমি জানি যে 1 ডি অ্যারের অ্যারেউইথ - অ্যারেহাইটের আকার থাকা দরকার, তবে প্রতিটি উপাদান কীভাবে সেট করতে হয় তা আমি জানি না।

উদাহরণস্বরূপ, (4,2,3) থেকে আমি কীভাবে (2,4,3) পার্থক্য করব? আমি অ্যারেটিকে x * y হিসাবে সেট করার চেষ্টা করেছি, তবে 2 * 4 এবং 4 * 2 এর ফলে অ্যারে একই স্পট হবে এবং সেগুলি আলাদা হওয়া আমার দরকার।

উত্তর:


166

অ্যারে উপাদানগুলি সারি ক্রমে বা কলাম ক্রমে সংরক্ষণ করা হবে এবং তারপরে এটির সাথে সামঞ্জস্য রেখে সিদ্ধান্ত নিতে হবে You http://en.wikedia.org/wiki/Row-major_order

সি ভাষা বহুমাত্রিক অ্যারেগুলির জন্য সারি ক্রম ব্যবহার করে

একক মাত্রিক অ্যারের সাথে এটি অনুকরণ করতে, আপনি সারি সূচকটি প্রস্থ দ্বারা গুণিত করুন এবং কলাম সূচকটি এভাবে যুক্ত করুন:

 int array[width * height];

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

7
আমি মনে করি এই উত্তরটি আরও পরিষ্কার, বিশেষত নতুনদের জন্য এটি এক লাইনে ফাংশন না লেখাই ভাল ... !! এটি যাইহোক খারাপ অনুশীলন .. :)
লিপিস

4
এই উত্তরটি যখন আপনার কাছে একটি সংকলক (যেমন এমবেডেড সিস্টেমগুলি) থাকে যাতে সঠিক বহুমাত্রিক অ্যারে সমর্থন না থাকে তার জন্যও দরকারী
অ্যালেক্স মার্শাল

4
কতজন লোক একই প্রশ্নের সঠিক উত্তর দিতে পারে তা আশ্চর্যজনক, তবে তাদের মধ্যে কেবল একটিই এটি এমনভাবে বলে যা বোঝা সহজ। এটি যতটা উত্তর পায় তত সহজ। যাইহোক, জনই কেবলমাত্র এর পক্ষে ভাল উত্তর দেওয়ার জন্য। বাকি সমস্ত আবর্জনা যা কেবল ইতিমধ্যে উত্তরটি জানেন তাদেরাই সহজেই বুঝতে পারবেন। জন, ধন্যবাদ এলিয়েনের পরিবর্তে প্রকৃতপক্ষে ইংরাজীতে কথা বলার জন্য। কিছু লোক শেখানোর ক্ষেত্রে কতটা খারাপ, এবং জন ননলারের মতো ভাল শিক্ষক কীভাবে অন্য সবার চেয়ে আরও কার্যকরভাবে কীভাবে সরলীকরণ এবং যোগাযোগ করবেন তা জানেন to
ব্যবহারকারী 2948630

6
এই ম্যাপিংটি কীভাবে বিপরীত করা যায় তা দেখানো ভাল হবে: যদি 1 ডি অ্যারের সূচক হয় alphaএবং 2 ডি অ্যারের Nসূচকগুলি সহ উভয় দিকের মাত্রা থাকে x, yতবে @ জনকনেলারের মতে alpha=x+N*y,। এটি উল্টানোর উপায়টি হবে সেটিংস x=alpha%Nএবং y= (alpha-alpha%N)/N
টিম

আমি প্রায় প্রতিদিন এখানে আসি!
ফিলিপ গুতেরেস

23

1D অ্যারে সূচকগুলিতে 2D অ্যারে সূচকগুলি পুনঃ গণনার জন্য আদর্শ সূত্র is

index = indexX * arrayWidth + indexY;

বিকল্পভাবে আপনি ব্যবহার করতে পারেন

index = indexY * arrayHeight + indexX;

(ধরে নিলাম যে arrayWidthএটি X অক্ষের arrayHeightসাথে এবং Y অক্ষের সাথে পরিমাপ করা হয়েছে )

অবশ্যই, কেউ একাধিক বিভিন্ন সূত্র নিয়ে আসতে পারে যা বিকল্প অনন্য ম্যাপিং সরবরাহ করে, তবে সাধারণত এর প্রয়োজন হয় না।

সি / সি ++ ভাষায় অন্তর্নির্মিত বহুমাত্রিক অ্যারেগুলিকে মেমরিতে সংরক্ষণ করা হয় যাতে শেষ সূচকটি দ্রুততম পরিবর্তিত হয় যার অর্থ একটি অ্যারে হিসাবে ঘোষণা করা হয়

int xy[10][10];

উপাদান xy[5][3]সঙ্গে সঙ্গে xy[5][4]মেমরি অনুসরণ করা হয়। আপনি উভয়টির "শেষ" হিসাবে বিবেচ্য কোন সূচক (এক্স বা ওয়াই) এর উপর নির্ভর করে উপরের দুটি সূত্রের মধ্যে একটি বেছে বেছে আপনিও এই সম্মেলনটি অনুসরণ করতে চাইতে পারেন।


17

উদাহরণ: আমরা SIZE_X এবং SIZE_Y আকারের একটি 2D অ্যারে উপস্থাপন করতে চাই। এর অর্থ হ'ল আমাদের কাছে MAXY মাপের পরপর সারি থাকবে। সুতরাং সেট ফাংশন হয়

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 ]; }

4
তোমার MAXXএবং MAXYমান confusingly নামকরণ করা হয়, কারণ সর্বোচ্চ মান xএবং yহয় MAXX - 1এবং MAXY - 1যথাক্রমে। সম্ভবত SIZE_Xএবং SIZE_Yভাল হতে পারে?
ক্যাফে

4
[y * ম্যাক্সেক্স + এক্স] কলাম অর্ডার, সারি অর্ডার নয়।
মাতলাব এইভাবে

@ প্রত্যেকটি: যদি না আপনি তথ্য স্পর্শ না করেন তবে বিশুদ্ধরূপে এই দু'টি পেতে / সেট করে ফাংশনগুলি এবং তারা একই সূত্রটি ব্যবহার না করে আপনি এটি পছন্দ মতো বা এটির মতো করতে পারেন। (গ্যারান্টিযুক্ত!)
আইটেম করুন

একটি ম্যাক্রো এখানে উপযুক্ত হতে পারে তো তুমি কি একটি নিম্ন স্তরের ডেটা অ্যাক্সেস (বিশেষ করে সিউডো-2d বিন্যাসে 1d-ইন্ডেক্স থেকে হতে অনুমিত হয় উপর অপ্রয়োজনীয় ফাংশান কল সারিবদ্ধ করছি না কখনও কখনও একটি অপ্টিমাইজেশান কৌশল।
krs013

কোডটি একটি শ্রেণীর সদস্য হিসাবে ধরে নেওয়া, এই কোডটি ইনলাইনড হবে। অন্যথায় স্পষ্ট ইনলাইন ম্যাক্রোর চেয়ে অনেক ভাল।
কর্নেল কিসিলেউইচজ

7

অন্যরা যেমন বলেছে সারি ক্রমে সি মানচিত্র

   #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

3

সারি প্রধান উদাহরণ ব্যবহার:

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);

1

ডেটা এমনভাবে সংরক্ষণ করা গুরুত্বপূর্ণ যে এটি ব্যবহৃত ভাষাগুলিতে পুনরুদ্ধার করা যায়। সি-ভাষার স্টোরগুলি সারি-প্রধান ক্রমে (প্রথম সারির সমস্তগুলি প্রথমে আসে, তারপরে দ্বিতীয় সারির সমস্ত, ...) প্রতিটি সূচক 0 থেকে এর মাত্রা -1 এ চলছে। সুতরাং অ্যারের x [2] [3] এর ক্রম হ'ল এক্স [0] [0], এক্স [0] [1], এক্স [0] [2], এক্স [1] [0], এক্স [1] [ 1], এক্স [1] [2]। সুতরাং সি ভাষায়, x [i] [j] একই স্থানটি 1-মাত্রিক অ্যারে এন্ট্রি x1dim [i * 3 + j] হিসাবে সংরক্ষণ করা হয়। যদি ডেটাটি সেভাবে সংরক্ষণ করা হয় তবে সি ভাষায় এটি পুনরুদ্ধার করা সহজ।

ফোর্টরান এবং ম্যাটল্যাব আলাদা। তারা কলাম-প্রধান ক্রমে সঞ্চয় করে (প্রথম কলামের সমস্তগুলি প্রথমে আসে, তারপরে দ্বিতীয় সারির সমস্ত, ...) এবং প্রতিটি সূচক 1 থেকে এর মাত্রা পর্যন্ত চলে। সুতরাং সূচী ক্রম সি এর বিপরীত এবং সমস্ত সূচকগুলি 1 টিরও বেশি। আপনি যদি সি ভাষার ক্রমে ডেটা সঞ্চয় করেন তবে ফরটারান এক্স_ফ_আরটিআরএন (জে + 1, আই + 1) ব্যবহার করে এক্স_সি_এলজ [i] [জে] খুঁজে পেতে পারে। উদাহরণস্বরূপ, এক্স_সি_ ভাষা [1] [2] X_FORTRAN (3,2) এর সমান। 1-মাত্রিক অ্যারেগুলিতে, ডেটা মানটি X1dim_C_language [2 * সিডিম 2 + 3] এ থাকে যা X1dim_FORTRAN (2 * এফডিএম 1 + 3 + 1) এর সমান অবস্থান। মনে রাখবেন যে সিডিম 2 = এফডিআইএম 1 কারণ সূচকের ক্রমটি বিপরীত।

ম্যাটল্যাব ফরটারনের সমান। সূচকগুলি সাধারণত সূচকগুলি ১ থেকে শুরু হওয়া ব্যতীত অ্যাডা সি হিসাবে সমান Any যে কোনও ভাষাতে সি বা ফোরট্রান অর্ডারগুলির মধ্যে একটিতে সূচক থাকবে এবং সূচকগুলি 0 বা 1 এ শুরু হবে এবং সঞ্চিত ডেটা পাওয়ার জন্য সেই অনুযায়ী সামঞ্জস্য করা যেতে পারে।

দুঃখিত যদি এই ব্যাখ্যাটি বিভ্রান্তিকর হয় তবে আমি মনে করি কোনও প্রোগ্রামারকে জানা এটি সঠিক এবং গুরুত্বপূর্ণ।


-2

আপনার জায়গাটিতে একটি সাধারণ পয়েন্টার সহ 2 ডি অ্যারে অ্যাক্সেস করতে সক্ষম হওয়া উচিত। অ্যারে [x] [y] পয়েন্টারে পি [0x * প্রস্থ + 0 ই] হিসাবে সাজানো হবে [0x * প্রস্থ + 1 ই] ... [0x * প্রস্থ + এন -1 ই] [1x * প্রস্থ + 0 ই] ইত্যাদি ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.