การรักษาโครงสร้างข้อมูล 1D เป็นกริด 2D


48

ฉันกำลังทำงานกับคลาสเนทีฟที่แสดงภาพ 2D เป็นอาร์เรย์ 1D หากคุณต้องการเปลี่ยนหนึ่งพิกเซลตัวอย่างเช่นตอนนี้คุณต้องได้รับดัชนีจากx,yพิกัด

ดังนั้นสมมติว่าเรามีอาร์เรย์ 1D 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 ]

ในบริบทของโปรแกรมของเรา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พิกัดใด ๆ(ฯลฯ )

เราจะทำสิ่งเหล่านี้ได้อย่างไร


ใน Matlab และประเภทคณิตศาสตร์ที่น่าจะเป็นไปได้ (ซึ่งกระจายไปสู่ ​​CS) เพื่อแปลงเมทริกซ์หนึ่งไปเป็นอีกเมทริกซ์ (ไม่ว่าจะเป็น 1x12 เป็น 2x6 หรือ 2x6 เป็น 3x4) เป็นที่รู้จักกันในชื่อ "reshaping" mathworks.com/help/matlab/ ref / reshape.html

@MichaelT: OP ไม่ได้เปลี่ยนตาราง ไม่ต้องพูดถึงการปรับขนาด 5x5 ให้เป็นอย่างอื่น (ซึ่งคงไม่สมเหตุสมผล) :)
IAbstract

@IAbstract คำถามนั้นอยู่ในการแก้ไขครั้งที่ 1แม้ว่า

คำตอบ:


86

2D / 1D - การทำแผนที่ค่อนข้างง่าย กำหนดขนาดอาร์เรย์ x และ y และ 2D width(สำหรับ x-direction) และheight(สำหรับ y-direction) คุณสามารถคำนวณดัชนีตามiใน 1D space (zero-based) โดย

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 มิติหรือมากกว่า ตัวอย่างเช่นสำหรับเมทริกซ์สามมิติที่มีขนาด "ความกว้าง", "ความสูง" และ "ความลึก":

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

และย้อนกลับ:

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

@awashburn ที่เป็นวิธีดั้งเดิมในการทำมันยังสร้างไว้ในคอมไพเลอร์สำหรับอาเรย์ 2 มิติแบบคงที่
ratchet freak

@ mtoast: ฉันไม่คิดอย่างนั้นมันเป็นแค่เลขจำนวนเต็มพื้นฐาน
Doc Brown

ตัวอย่างนี้ผิดสำหรับ 3D ความลึกของคำในการคำนวณควรเป็นความสูง
jiggunjer

@ jiggunjer: ขอบคุณสำหรับการแก้ไขเปลี่ยนคำตอบของฉันตาม
Doc Brown

1
@makakas: นั่นคือแบบฝึกหัดที่เหลือไว้สำหรับผู้อ่าน ;-) คำแนะนำ: คุณต้องเพิ่ม / ย่อขอบเขตล่างเป็นออฟเซ็ตในตำแหน่งที่ถูกต้อง แต่ก่อนที่คุณจะลองทำสิ่งนี้ให้ชี้แจงตัวเองว่าคุณหมายถึงอาร์เรย์ใดใน 1 อาร์เรย์หรือ 2 มิติ
Doc Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.