Memperlakukan struktur data 1D sebagai kisi 2D

48

Saya bekerja dengan kelas asli yang mewakili gambar 2D sebagai array 1D. Jika Anda ingin mengubah satu piksel, misalnya, Anda perlu sekarang cara menurunkan indeks dari x,ykoordinat.

Jadi, katakanlah kita memiliki array 1D array1dseperti ini:

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 ]

Dalam konteks program kami, array1dmerupakan kisi 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

Dan kami ingin melakukan operasi array1dseperti:

  • Dapatkan nilai pada x,ykoordinat (dalam contoh ini, 1,2akan berikan l)
  • Dapatkan sub-grid menggunakan x,y,width,height( 1,2,2,2akan memberi [l, m, q, r])
  • Tetapkan nilai pada x,ykoordinat apa pun (dll.)

Bagaimana kita melakukan ini?

Gladstone. Terus
sumber
Dalam Matlab, dan dengan demikian kemungkinan jenis matematika (yang tumpah ke CS), untuk mengubah satu matriks menjadi yang lain (baik itu 1x12 menjadi 2x6 atau 2x6 menjadi 3x4) dikenal sebagai "membentuk kembali" mathworks.com/help/matlab/ ref / reshape.html
@MichaelT: OP tidak membentuk kembali grid. Tidak disebutkan tentang membentuk kembali 5x5 ke hal lain (yang tidak masuk akal juga). :)
IAbstract
@ Abaikan pertanyaan itu dalam revisi 1 .

Jawaban:

86

2D / 1D - pemetaan cukup sederhana. Diberikan ukuran array x dan y, dan 2D width(untuk arah-x) dan height(untuk arah-y), Anda dapat menghitung indeks yang sesuai idalam ruang 1D (berbasis-nol) dengan

i = x + width*y;

dan operasi sebaliknya adalah

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

Anda dapat memperluas ini dengan mudah ke 3 dimensi atau lebih. Misalnya, untuk matriks 3D dengan dimensi "lebar", "tinggi" dan "kedalaman":

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

dan membalikkan:

x = i % width;
y = (i / width)%height;
z = i / (width*height);
Doc Brown
sumber
@awashburn itu adalah cara tradisional untuk melakukannya, itu bahkan dibangun menjadi kompiler untuk array 2D statis
ratchet freak
@toast: Saya kira tidak, itu hanya bilangan bulat matematika dasar.
Doc Brown
Contoh ini salah untuk 3D. Kedalaman kata dalam perhitungan harus tinggi.
jiggunjer
@ jiggunjer: terima kasih atas koreksinya, ubah jawaban saya.
Doc Brown
1
@ Makakas: itu adalah latihan yang tersisa untuk pembaca ;-). Petunjuk: Anda harus menambahkan / mengurangi batas bawah sebagai offset di tempat yang tepat. Tetapi sebelum Anda mencoba ini, jelaskan pada diri sendiri yang mana dari dua array yang Anda maksud, 1D atau array 2D.
Doc Brown