Bonjour,
Je bloque actuellement sur un problème de maths qui à pour origine un programme sur lequel je bosse actuellement. Je travail sur des «matrices triangulaires» que je stocke de manière linéaire.
Lorsque l'on veut stocker une matrice triangulaire, une manière simple et efficace consiste à utiliser un simple tableau et de linéariser la matrice:
- Soit mat[N][N] notre matrice telle que mat[i][j] ;) 0 uniquement si i ;) j.
- On calcul l'index par la formule : idx(i, j) = (j*(j+1))/2 + i
Avec cette méthode, la matrice suivante:
1 0 0
2 3 0
4 5 6
Sera stocker sou la forme du tableau suivant:
1 2 3 4 5 6
On peut généraliser cette méthode de stockage au cas à 3 dimensions facilement :
- Soit mat[N][N][N] notre matrice telle que mat[i][j][k] ;) 0 uniquement si i ;) j ;) k.
- On calcul l'index par la formule : idx(i, j, k) = (k*(k+1)*(k+2))/6 + (j*(j+1))/2 + i
Jusque là, aucun problème et tout marche très bien. Mon soucis est comment faire pour inverser cette transformation ?
Je dispose de l'index, je connais le nombre de dimensions (2 ou 3 uniquement dans mon cas) et je sais que les valeurs que je dois trouver sont des entiers tels que 0 ;) i ;) j ;) N ou 0 ;) i ;) j ;) k ;) N suivant les cas. Je sais aussi que la solution existe et quelle est unique mais comment la retrouver ?
Je bloque sur ce problème. Je précise que je cherche la solution sous forme de formule pour i, j et k. J'ai une solution qui utilise des boucle pour retrouver les trois valeurs mais elle n'est pas efficace et surtout peu satisfaisante.
Merci d'avance pour l'aide ou les informations que vous pourrez m'apporter.
Jekub