Обработка 1D структуры данных как 2D сетки

48

Я работаю с собственным классом, который представляет 2D-изображение в виде одномерного массива. Например, если вы хотите изменить один пиксель, вам нужно узнать, как получить индекс из x,yкоординат.

Итак, допустим, у нас есть одномерный массив, 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координате (и т. Д.)

Как мы это делаем?

GladstoneKeep
источник
В Matlab, и, следовательно, вероятнее всего, математические типы (которые выливаются в CS) для преобразования одной матрицы в другую (будь то 1x12 в 2x6 или 2x6 в 3x4) известны как «изменение формы» mathworks.com/help/matlab/ ref / reshape.html
@MichaelT: ОП не меняет сетку. Никаких упоминаний о преобразовании 5х5 во что-либо еще (что в любом случае не имеет смысла). :)
IAbstract
@IAbstract этот вопрос был в редакции 1, хотя.

Ответы:

86

2D / 1D - отображение довольно простое. Учитывая x и y, а также размеры двумерного массива 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: спасибо за исправление, соответственно изменил мой ответ.
Док Браун
1
@makakas: это упражнение, оставленное читателю ;-). Подсказка: вы должны добавить / вычесть нижнюю границу как смещение в нужных местах. Но прежде чем попробовать это, выясните для себя, какой из двух массивов вы имеете в виду, 1D или 2D массив.
Док Браун