Comment cartographier les indices d'une matrice 1 matrice dimensionnelle (C++)?
J'ai un 8x8 de matrice, comme ceci:
char matrix[8][8];
Aussi, j'ai un tableau de 64 éléments, comme ceci:
char array[64];
Ensuite, j'ai établi la matrice sous la forme d'un tableau, et rempli les cellules avec des nombres, chaque nombre est incrémenté de gauche à droite, de haut en bas.
Si j'ai, disons, les index 3 (colonne) et 4 (ligne) dans la matrice, je sais qu'il correspond à l'élément à la position 35 dans le tableau, comme on peut le voir dans le tableau que j'ai dessiné. Je crois qu'il y est une sorte de formule de traduire les 2 indices de la matrice dans un seul index du tableau, mais je ne peux pas comprendre ce que c'est.
Des idées?
arr[i*cols+j]
pour l'équivalentmatrix[i][j]
d'indexation, en supposant que vous voulez de la ligne majeure de la commande, etcols
est votre ligne définie la largeur des colonnes (dans votre exemple du cas,8
).- J'ai essayé toutes sortes de calculs simples comme la multiplication de ligne * colonne * 8, division, etc. mais ça ne fonctionne pas. Je ne suis pas très bonne en maths.
Vous devez vous connecter pour publier un commentaire.
La façon dont la plupart des langues magasin multi-dimensions des tableaux est de faire une conversion comme suit:
Si
matrix
a de taille n par m [c'est à dire, je passe de 0 à (n-1) et j allant de 0 à (m-1) ], alors:matrix[ i ][ j ] = array[ i*m + j ]
.Il est juste comme un système de numération de base 'n'. Notez que la taille de la dernière dimension n'a pas d'importance.
Pour une compréhension conceptuelle, pensez à un (3x5) de la matrice avec le " i "est le numéro de ligne, et" j " comme le numéro de la colonne. Si vous commencer la numérotation à partir
i,j = (0,0) --> 0
. Pour 'row-major' de la commande (de ce genre), la mise en page ressemble à ceci:Que vous vous déplacez le long de la ligne (c'est à dire augmenter le nombre de colonne), vous venez de commencer à compter en place, de sorte que les indices de Tableau sont
0,1,2...
. Lorsque vous arrivez à la deuxième ligne, vous avez déjà5
entrées, afin de commencer avec des indices1*5 + 0,1,2...
. Sur la troisième ligne, vous avez2*5
entrées déjà, ainsi que les indices sont2*5 + 0,1,2...
.De dimension supérieure, cette idée se généralise, c'est à dire en 3D pour une
matrix
L en N par M:matrix[ i ][ j ][ k ] = array[ i*(N*M) + j*M + k ]
et ainsi de suite.
Pour une très bonne explication, voir: http://www.cplusplus.com/doc/tutorial/arrays/; ou pour certains aspects plus techniques: http://en.wikipedia.org/wiki/Row-major_order
j + (i * n)
et pasi + (j * n)
comme vous le suggérez? Examiner les coordonnées2,3
, qui devrait revenir 13 utilisation de votre matrice:3 + (2 * 5) = 13
. Si nous avons utilisé votre formule au lieu de cela, nous aurions2 + (3 * 5) = 17
. Ai-je raté quelque chose?Pour ligne-major de la commande, je crois que la déclaration
matrix[ i ][ j ] = array[ i*n + j ]
est faux.Le décalage doit être
offset = (row * NUMCOLS) + column
.Votre déclaration de résultats
row * NUMROWS + column
, ce qui est faux.Les liens que vous avez fournies donner une explication correcte.
Quelque chose comme cela?
L'exemple ci-dessous convertit un indice à partir des coordonnées x et y.