Tratar una estructura de datos 1D como una cuadrícula 2D

48

Estoy trabajando con una clase nativa que representa una imagen 2D como una matriz 1D. Si desea cambiar un píxel, por ejemplo, necesita saber cómo derivar el índice de las x,ycoordenadas.

Entonces, digamos que tenemos una matriz 1D array1dcomo esta:

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 ]

En el contexto de nuestro programa, array1drepresenta una cuadrícula 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

Y queremos realizar operaciones array1dcomo:

  • Obtenga el valor en las x,ycoordenadas (en este ejemplo, 1,2daría l)
  • Obtenga cualquier subcuadrícula usando x,y,width,height( 1,2,2,2daría [l, m, q, r])
  • Establezca el valor en cualquier x,ycoordenada (etc.)

¿Cómo hacemos esto?

GladstoneMantener
fuente
En Matlab, y por lo tanto los tipos matemáticos más probables (que se convierten en CS), convertir una matriz en otra (ya sea 1x12 en 2x6 o 2x6 en 3x4) se conoce como "remodelación" de mathworks.com/help/matlab/ ref / reshape.html
@MichaelT: el OP no está reformando la cuadrícula. No se menciona la remodelación del 5x5 a otra cosa (lo cual no tendría sentido de todos modos) :)
Resumen de
Sin embargo, @IAbstract esa pregunta estaba en la revisión 1 .

Respuestas:

86

2D / 1D: el mapeo es bastante simple. Dados x e y, y tamaños de matriz 2D width(para la dirección x) y height(para la dirección y), puede calcular el índice correspondiente ien el espacio 1D (basado en cero) por

i = x + width*y;

y la operación inversa es

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

Puede ampliar esto fácilmente a 3 o más dimensiones. Por ejemplo, para una matriz 3D con dimensiones "ancho", "alto" y "profundidad":

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

y reversa:

x = i % width;
y = (i / width)%height;
z = i / (width*height);
Doc Brown
fuente
@awashburn, que es la forma tradicional de hacerlo, incluso está integrado en compiladores para matrices 2D estáticas
Ratchet Freak
@mtoast: No lo creo, es matemática entera básica.
Doc Brown
Este ejemplo es incorrecto para 3D. La palabra profundidad en el cálculo debe ser altura.
jiggunjer
@jiggunjer: gracias por la corrección, cambié mi respuesta en consecuencia.
Doc Brown
1
@makakas: ese es un ejercicio que le queda al lector ;-). Sugerencia: debe agregar / restar el límite inferior como un desplazamiento en los lugares correctos. Pero antes de intentar esto, aclare a sí mismo a cuál de las dos matrices se refiere, la matriz 1D o la 2D.
Doc Brown