Xử lý cấu trúc dữ liệu 1D dưới dạng lưới 2D


48

Tôi đang làm việc với một lớp nguyên bản đại diện cho hình ảnh 2D dưới dạng mảng 1D. Ví dụ, nếu bạn muốn thay đổi một pixel, bạn cần phải lấy chỉ mục từ x,ytọa độ.

Vì vậy, giả sử chúng ta có một mảng 1D array1dnhư thế này:

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 ]

Trong ngữ cảnh của chương trình của chúng tôi, array1dđại diện cho lưới 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

Và chúng tôi muốn thực hiện các hoạt động array1dnhư:

  • Lấy giá trị tại x,ytọa độ (trong ví dụ này, 1,2sẽ cung cấp l)
  • Nhận bất kỳ lưới con bằng cách sử dụng x,y,width,height( 1,2,2,2sẽ cung cấp [l, m, q, r])
  • Đặt giá trị tại bất kỳ x,ytọa độ nào (v.v.)

Làm thế nào để chúng ta làm những điều này?


Trong Matlab, và do đó có khả năng là các loại toán học (tràn vào CS), để chuyển đổi một ma trận thành một ma trận khác (có thể là 1x12 thành 2x6 hoặc 2x6 thành 3x4) được gọi là "định hình lại" mathworks.com/help/matlab/ ref / reshape.html

@MichaelT: OP không định hình lại lưới. Không đề cập đến việc định hình lại 5x5 cho bất cứ điều gì khác (dù sao cũng không có ý nghĩa gì). :)
Tôi chấp nhận

@IAb trích câu hỏi đó trong phiên bản 1 mặc dù.

Câu trả lời:


86

2D / 1D - ánh xạ khá đơn giản. Cho x và y, và kích thước mảng 2D width(cho hướng x) và height(cho hướng y), bạn có thể tính chỉ số theo ikhông gian 1D (không dựa trên)

i = x + width*y;

và hoạt động ngược lại là

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

Bạn có thể mở rộng dễ dàng đến 3 chiều trở lên. Ví dụ: đối với ma trận 3D có kích thước "chiều rộng", "chiều cao" và "chiều sâu":

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

và ngược lại:

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

@awashburn đó là cách truyền thống để làm điều đó, nó thậm chí còn được tích hợp vào trình biên dịch cho mảng 2D tĩnh
ratchet freak

@mtoast: Tôi không nghĩ vậy, nó chỉ là toán học số nguyên cơ bản.
Doc Brown

Ví dụ này là sai cho 3D. Độ sâu từ trong tính toán nên là chiều cao.
jiggunjer

@jiggunjer: cảm ơn vì đã sửa, thay đổi câu trả lời của tôi cho phù hợp.
Doc Brown

1
@makakas: đó là một bài tập để lại cho người đọc ;-). Gợi ý: bạn phải thêm / bớt giới hạn dưới dưới dạng phần bù ở đúng vị trí. Nhưng trước khi bạn thử điều này, hãy tự làm rõ về mảng nào trong hai mảng của bạn, mảng 1D hoặc 2D.
Doc Brown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.