Eu quero representar uma matriz 2D com uma matriz 1D. Uma função passará os dois indicadores (x, y) e o valor a armazenar. Esses dois indicadores representariam um único elemento de uma matriz 1D e configurariam de acordo. Eu sei que a matriz 1D precisa ter o tamanho de arrayWidth × arrayHeight, mas não sei como definir cada elemento.
Por exemplo, como faço para distinguir (2,4,3) de (4,2,3)? Tentei definir a matriz como x * y, mas 2 * 4 e 4 * 2 resultariam no mesmo ponto na matriz e preciso que sejam diferentes.
fonte
alpha
, e o array 2D tiver dimensãoN
em ambas as direções com índicesx, y
, então de acordo com @JohnKnoelleralpha=x+N*y
,. A maneira de inverter isso seria definindox=alpha%N
ey= (alpha-alpha%N)/N
.A fórmula típica para recálculo de índices de matriz 2D em índice de matriz 1D é
Alternativamente, você pode usar
(assumindo que
arrayWidth
é medido ao longo do eixo X earrayHeight
ao longo do eixo Y)Claro, pode-se chegar a muitas fórmulas diferentes que fornecem mapeamentos exclusivos alternativos, mas normalmente não há necessidade disso.
Em linguagens C / C ++, os arrays multidimensionais integrados são armazenados na memória para que o último índice mude mais rápido, o que significa que para um array declarado como
elemento
xy[5][3]
é imediatamente seguido porxy[5][4]
na memória. Você também pode querer seguir essa convenção, escolhendo uma das duas fórmulas acima, dependendo de qual índice (X ou Y) você considera ser o "último" dos dois.fonte
Exemplo: queremos representar um array 2D de tamanho SIZE_X e SIZE_Y. Isso significa que teremos MAXY linhas consecutivas de tamanho MAXX. Portanto, a função definida é
O resultado seria:
fonte
MAXX
eMAXY
são nomeados de forma confusa, porque os valores máximos dex
ey
sãoMAXX - 1
e,MAXY - 1
respectivamente. TalvezSIZE_X
eSIZE_Y
possa ser melhor?Como outros disseram, mapas C em ordem de linha
Resultado:
fonte
usando o exemplo principal da linha:
fonte
É importante armazenar os dados de forma que possam ser recuperados nos idiomas usados. A linguagem C armazena na ordem da linha principal (toda a primeira linha vem primeiro, depois toda a segunda linha, ...) com cada índice indo de 0 a sua dimensão-1. Portanto, a ordem da matriz x [2] [3] é x [0] [0], x [0] [1], x [0] [2], x [1] [0], x [1] [ 1], x [1] [2]. Portanto, na linguagem C, x [i] [j] é armazenado no mesmo lugar que uma entrada de array unidimensional x1dim [i * 3 + j]. Se os dados forem armazenados dessa forma, é fácil recuperá-los em linguagem C.
Fortran e MATLAB são diferentes. Eles são armazenados na ordem da coluna principal (toda a primeira coluna vem primeiro, depois toda a segunda linha, ...) e cada índice vai de 1 para sua dimensão. Portanto, a ordem do índice é o inverso de C e todos os índices são 1 maior. Se você armazenar os dados na ordem da linguagem C, FORTRAN pode encontrar X_C_language [i] [j] usando X_FORTRAN (j + 1, i + 1). Por exemplo, X_C_language [1] [2] é igual a X_FORTRAN (3,2). Em matrizes unidimensionais, esse valor de dados está em X1dim_C_language [2 * Cdim2 + 3], que é a mesma posição que X1dim_FORTRAN (2 * Fdim1 + 3 + 1). Lembre-se de que Cdim2 = Fdim1 porque a ordem dos índices é invertida.
MATLAB é igual a FORTRAN. Ada é igual a C, exceto que os índices normalmente começam em 1. Qualquer idioma terá os índices em uma dessas ordens C ou FORTRAN e os índices começarão em 0 ou 1 e podem ser ajustados de acordo para obter os dados armazenados.
Desculpe se esta explicação é confusa, mas acho que é precisa e importante para um programador saber.
fonte
Você deve ser capaz de acessar o array 2d com um simples ponteiro no lugar. A matriz [x] [y] será organizada no ponteiro como p [0x * largura + 0y] [0x * largura + 1y] ... [0x * largura + n-1y] [1x * largura + 0y] etc .
fonte