2016-11-04 2 views
2

Je n'utilise aucune bibliothèque matricielle, mais std :: vector simple pour mes données matricielles.C++ utilise un tableau 1D avec des données 2D

Pour le remplir avec des données 2D J'utilise ce code:

data[iy + dataPointsY * ix] = value; 

Je voudrais savoir est c'est correct ou si elle doit être dans l'autre sens (ix premier). À mon avis, fftw a besoin de 'Row-major Format'. Comme je l'utilise, la formule devrait être au format row-major.

+4

Le point clé est, leur façon de stocker les données devrait être exactement la façon dont vous récupérez. – phoxis

+0

sûr, mais je sais que d'autres bibliothèques s'appuient sur le format row.major. Depuis que je l'utilise, je devrais commander les données en fonction. –

+0

Si vous essayez d'encoder l'indexation 2d dans un format linéaire attendu par une autre bibliothèque, vous devez suivre exactement le format spécifié par cette bibliothèque. Tout comme les fonctions MPI, tous les éléments de données d'une matrice doivent être adjacents en mémoire. – phoxis

Répondre

1

En supposant que vous voulez ramer le format majeur pour fftw, ce que vous voulez est:

data[ix + iy*dataPointsY] 

Le point de ligne -Major est, lorsque l'indice combiné a augmenté de 1, la ligne correspondant index serait être le même (en supposant ne pas déborder à la rangée suivante).

double m[4][4]; 
mp = (double*)m; 
mp[1+2*3] == m[2][1]; //true 
mp[2+2*3] == m[2][2]; //true 
mp[2+2*3] == m[3][1]; //false 

En général, il n'y a pas de "bonne" façon de stocker une matrice. Le format majeur de ligne est également appelé matrice de type «C», tandis que la colonne majeure est appelée «matrice de style fortran». La dénomination est due à un schéma d'indexation multidimensionnel différent entre les deux langages.