Tratar uma estrutura de dados 1D como grade 2D


48

Estou trabalhando com uma classe nativa que representa uma imagem 2D como uma matriz 1D. Se você deseja alterar um pixel, por exemplo, agora precisa derivar o índice das x,ycoordenadas.

Então, digamos que temos uma 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 ]

No contexto do nosso programa, array1drepresenta uma grade 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

E queremos executar operações array1dcomo:

  • Obtenha o valor nas x,ycoordenadas (neste exemplo, 1,2daria l)
  • Obtenha qualquer sub-grade usando x,y,width,height( 1,2,2,2daria [l, m, q, r])
  • Defina o valor em qualquer x,ycoordenada (etc.)

Como fazemos isso?


No Matlab, e, portanto, os prováveis ​​tipos matemáticos (que se espalham para CS), converter uma matriz em outra (seja 1x12 em 2x6 ou 2x6 em 3x4) é conhecido como "remodelar" mathworks.com/help/matlab/ ref / reshape.html

@ MichaelT: o OP não está reformulando a grade. Nenhuma menção de remodelar o 5x5 para qualquer outra coisa (o que não faria sentido de qualquer maneira). :)
IAbstract 17/16

@IAbstract essa pergunta estava na revisão 1 .

Respostas:


86

2D / 1D - o mapeamento é bastante simples. Dados os tamanhos de matriz xey, e 2D width(para a direção x) e height(para a direção y), você pode calcular o índice correspondente ino espaço 1D (com base em zero)

i = x + width*y;

e a operação reversa é

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

Você pode estender isso facilmente para 3 ou mais dimensões. Por exemplo, para uma matriz 3D com as dimensões "largura", "altura" e "profundidade":

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

e inverter:

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

@awashburn que é a maneira tradicional de fazer isso, é ainda construída em compiladores para estática 2D matrizes
catraca aberração

@ mtoast: Acho que não, é apenas matemática inteira básica.
Doc Brown

Este exemplo está errado para 3D. A profundidade da palavra no cálculo deve ser a altura.
22415 jiggunjer

@ jiggunjer: obrigado pela correção, mudei minha resposta de acordo.
Doc Brown

1
@makakas: esse é um exercício deixado para o leitor ;-). Dica: você deve adicionar / subtrair o limite inferior como um deslocamento nos lugares certos. Mas antes de tentar isso, esclareça para você qual das duas matrizes que você quer dizer, a matriz 1D ou 2D.
Doc Brown
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.