Трактування 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) відомий як "переформатування" mathworks.com/help/matlab/ ref / reshape.html

@MichaelT: ОП не переробляє мережу. Ніякої згадки про перестановку 5х5 ні на що інше (що все одно не мало б сенсу). :)
IAb Abstract

@IAbrief це питання було в редакції 1, хоча.

Відповіді:


86

2D / 1D - відображення досить просте. Враховуючи розміри x і y та 2D масиви width(для x-напрямку) та height(для y-напрямку), ви можете обчислити відповідний індекс iв 1D просторі (нульовий) за допомогою

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 або більше вимірів. Наприклад, для матриці 3D розмірами "ширина", "висота" та "глибина":

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

і назад:

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

@awashburn - це традиційний спосіб зробити це, він навіть вбудований у компілятори для статичних 2D-масивів
ratchet freak

@mtoast: Я не думаю, що це просто основне математичне число.
Док Браун

Цей приклад неправильний для 3D. Глибина слова в обчисленні повинна бути висотою.
jiggunjer

@jiggunjer: дякую за виправлення, відповідно змінив свою відповідь.
Doc Brown

1
@makakas: це вправа, яка залишається читачеві ;-). Підказка: ви повинні додати / підрегулювати нижню межу як зміщення у потрібних місцях. Але перш ніж спробувати це, уточніть для себе, який із двох масивів ви маєте на увазі, 1D або 2D масив.
Док Браун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.