1B veri yapısını 2B ızgara olarak işleme alma


48

2D görüntüyü 1D dizisi olarak temsil eden yerel bir sınıfla çalışıyorum. Örneğin, bir pikseli değiştirmek istiyorsanız, dizini x,ykoordinatlardan nasıl türeteceğinizi öğrenmeniz gerekir .

Diyelim ki şöyle bir 1D dizimiz var array1d:

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 ]

Programımız kapsamında array1d2B bir ızgarayı temsil eder:

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

Ve biz aşağıdaki array1dgibi işlemleri yapmak istiyoruz :

  • x,yKoordinatlardaki değeri al (bu örnekte, 1,2vereceği l)
  • Kullanarak herhangi bir alt ızgarayı alın x,y,width,height( 1,2,2,2verecek [l, m, q, r])
  • Değeri herhangi bir x,ykoordinatta (vb.) Ayarlayın .

Bunları nasıl yaparız?


Matlab'da ve dolayısıyla muhtemel matematik türleri (CS'ye dökülen), bir matrisi diğerine dönüştürmek ( 1x12'yi 2x6'ya veya 2x6'yı 3x4'e

@MichaelT: OP ızgarayı yeniden şekillendirmiyor. 5x5'i başka hiçbir şeye yeniden şekillendirmekten bahsetmeyin (bu zaten mantıklı olmaz). :)
IAbstract

@IAbstract bu soru yine de 1 revizyondaydı .

Yanıtlar:


86

2D / 1D - haritalama oldukça basittir. X ve y, ve 2D dizi boyutları width(x yönü için) ve height(y yönü için ) göz önüne alındığında i, 1D boşluğuna göre (0 tabanlı) ilgili dizini hesaplayabilirsiniz.

i = x + width*y;

ve ters işlem

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

Bunu kolayca 3 veya daha fazla boyuta genişletebilirsiniz. Örneğin, "genişlik", "yükseklik" ve "derinlik" boyutlarına sahip bir 3D matris için:

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

ve geri:

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

hatta statik 2D diziler için derleyici içine inşa edilmiştir, bunu yapmak için geleneksel yoludur @awashburn
mandal ucube

@mtoast: Sanmıyorum, sadece basit tamsayılı matematik.
Doktor Brown

Bu örnek 3D için yanlıştır. Hesaplamadaki kelime derinliği yükseklik olmalıdır.
jiggunjer

@jiggunjer: Düzeltme için teşekkürler, buna göre cevabımı değiştirdim.
Doktor Brown,

1
@makakas: Bu okuyucuya bırakılan bir egzersiz ;-). İpucu: alt sınırı doğru yerlere ofset olarak eklemeniz / çıkartmanız gerekir. Ancak, bunu denemeden önce, hangi iki diziden hangisini kastediyorsunuz, 1D veya 2D dizi.
Doktor Brown,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.