2009-08-26 6 views
0

i ont un std :: vecteur, à savoirarithmétique des pointeurs sur des vecteurs dans C++

vector<vector<vector> > > mdata; 

je veux transmettre des données de mon vecteur MDATA à la fonction GSL

gsl_spline_init(gsl_spline * spline, const double xa[], const double ya[], size_t size); 

comme toi. je l'ai déjà compris que je peux faire des choses comme

gsl_spline_init(spline, &(mgrid.front()), &(mdata[i][j][k].front()), mgrid.size()); 

cela est très bien si je veux je transmettre les données à partir MDATA pour fixé, j à gsl_spline_init().

Cependant, maintenant je devrais passer le long de la première dimension de mdata, donc pour j fixe, k. Je sais que pour deux indices fixes, tous les vecteurs le long des dimensions restantes ont la même longueur, donc mon vecteur est un 'cube régulier'. donc le décalage entre toutes les valeurs dont j'ai besoin devrait être le même.

Bien sûr, je pourrais créer un vecteur temporaire

int j = 123; 
int k = 321; 
vector<double> tmp; 
for (int i = 0: i < mdata.size(); i++) 
    tmp.push_back(mdata[i][j][k]); 
gsl_spline_init(spline, &(mgrid.front()), &(tmp.front()), mgrid.size()); 

mais cela semble trop compliqué. peut-être y at-il un moyen d'atteindre mon objectif avec l'arithmétique du pointeur?

toute aide est grandement appréciée :)

+0

Vous voudrez peut-être rechercher l'une des classes matricielles qui se cachent sur le Web. vecteur de vecteur d'odeurs de vecteur. – gimpf

Répondre

1

Vous ne pouvez vraiment pas faire sans redéfinition de la fonction de consommation de tableau gsl_spline_init() - elle repose sur les données transmises étant un bloc contigu de données. Ce n'est pas le cas avec votre vecteur à trois niveaux - non seulement c'est un cube mais chaque niveau dispose également d'un tampon séparé alloué sur le tas.

1

Cela ne peut pas être fait. Non seulement avec des vecteurs, mais même avec des tableaux simples, seule la dernière dimension est un bloc de données contigu. Si gsl_spline_init prenait un itérateur au lieu de tableau, vous pourriez essayer de créer un foncteur pour choisir les données appropriées mais je ne suis pas sûr que cela vaille la peine d'essayer. Aucune arithmétique de pointeur ne peut vous aider.

+0

Un tableau 'int a [5] [6] [7];' est en mémoire contiguë et peut être traversée en série via un pointeur. –

+0

Je voulais dire que les valeurs a [1] [2] [0], a [1] [2] [1], a [1] [2] [2] font une partie contiguë de la mémoire et peuvent être passé faire la fonction. Les valeurs a [0] [1] [2], a [1] [1] [2], a [2] [1] [2] ne font pas une partie contiguë de la mémoire et ne peuvent pas être transmises au fonction. –

Questions connexes