IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

passage d'un tableau unidimentionnel � tridimentionnel


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    �tudiant
    Inscrit en
    Avril 2010
    Messages
    88
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par d�faut passage d'un tableau unidimentionnel � tridimentionnel
    Bonjour,

    je suis entrain de coder un programme qui lit un fichier ou se trouvent 5 tableaux.

    Ces tableaux ont la dimension suivante : X(Nbi*Nbj*Nbk) et je voudrais passer � des tableaux tridimensionnel du genre X_nw(Nbi,Nbj,Nbk).

    Est ce que vous sauriez l'algorithme n�cessaire pour faire ce passage?

    Merci bien

    Manal

  2. #2
    Membre exp�riment�

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    171
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 171
    Par d�faut
    Bonjour,

    J'aurais tendance � dire que tout d�pend de comment sont agenc�s les �l�ments dans le tableau unidimensionnel.

    Si c'est :
    [i1, j1, k1, i2, j2, k2, ...]
    ou bien :
    [i1, i2, i3, .... , j1, j2, j3, .... , k1, k2, k3,.... ]
    ou bien encore autre chose...

    De m�me pour ton tableau 3 dimensions, il faut savoir comment doivent �tre agenc�s les �lements dedans.

    Une fois cette probl�matique surmont�e... trouver un algo qui fait la correspondance devrait �tre plus simple.

  3. #3
    Membre confirm�
    Profil pro
    �tudiant
    Inscrit en
    Avril 2010
    Messages
    88
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par d�faut
    Bonjour,
    Mes �l�ments sont �crits de la mani�re suivante :

    [i1 j1 k1 l1 m1
    i2 j2 k2 l2 m2
    ...................... ]

    donc mon programme lit chaque colonne et la place dans un tableau C1 --> C5,
    ensuite je veux transformer ces tableaux unidimensionnels en des tableaux tridimentionnels.
    Genre passe de C1(a*b*c) --> C1(a,b,c)

    j'ai fait :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (k=0 , k < c , k++){
    for (j=0 , j< b, j++){
    for (i=0 , i<a,i++){
     
    C_final[i][j][k]=C1(i*j*k)
               }
           }
     }
    est ce que �a a l'air correct d'un point de vue correspondance d'indices?

    Merci

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    Par d�faut
    Le mieux a faire � mon avis c'est d'utiliser la surcharge d'op�rateur pour une classe de ton cru, en particulier operator()(int, int, int).
    Sinon, � vue de nez, les indices c'est pas bon !
    Avec ton �criture, C_final[1][2][1] = C_final[2][1][1] = C_final[1][1][2]

  5. #5
    Membre chevronn� Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par d�faut
    Comme l'a dit Aurelpitiless, tout d�pend comment les �l�ments de ton tableau sont agenc�s.

    Pour visualiser un peu (en 3d �a reste encore possible), les donn�es sont organis�es comme dans un gros cube, subdivis� en petits cubes repr�sentant chacun un �l�ment du tableau. On peut d�couper ce cube en tranches, les tranches en lignes et les lignes en cellules.

    Supposons que i, j et k sont les indices respectives de la cellule, de la ligne et de la tranche.

    L'indice de l'�l�ment dans le tableau unidimensionnel serait calcul�s ainsi:

    O� T est la taile d'une tranche et L celle d'une ligne, toutes les deux exprim�es en nombre d'�l�ments (les petits cubes).

    Cette exemple suppose que les �l�ments dans ton tableau sont organis�s dans l'ordre cellule-ligne-tranche. C'est � dire que lorsque que tu balayes lin�airement les �l�ments de ton tableau unidimensionnel, tu passe d'abord de cellule en cellule, puis de ligne en ligne, finalement de tranche en tranche.

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par d�faut
    l'acces par calcul d'un polynome est bof bof. Knuth a une variante interessante dans les NRC ou il construit une table d'indexage � l'allcoation. Cette m�thode ets en g��nral au moins aussi rapide mais facilite l'extebsion � un nombre de dimension arbritraire.

    Un exemple en 2D:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    template<class T> static inline T** alloc( size_t h, size_t w )
    {
      typedef T* ptr_type;
      ptr_type* m;
      m    = new ptr_type[h];
      m[0] = new T[h*w];
      for(size_t i=1;i<h;i++) m[i]=m[i-1]+w;
      return m;
    }
     
    template<class T> static inline T** share( T* data, size_t h, size_t w )
    {
      typedef T* ptr_type;
      ptr_type* m;
      m    = new ptr_type[h];
      m[0] = data;
      for(size_t i=1;i<h;i++) m[i]=m[i-1]+w;
      return m;
    }
     
    template<class T> static inline void release( T** ptr, bool is_shared = false )
    {
      if(ptr && !is_shared) delete[] ptr[0];
      if(ptr) delete[] ptr;
    }
     
    int main()
    {
      float** tab;
      int width  = 5;
      int height = 3;
      tab = alloc<float>(height, width); // column first
     
      for(int r = 0;r<height;++r)
       for(int c = 0;c<width;++c)
        tab[r][c] = 1./(1+r+c);
     
      release(tab);
    }

  7. #7
    Invit�
    Invit�(e)
    Par d�faut
    Bonsoir manaliac,

    Tu peux t'inspirer de cet exemple 1D -> 2D
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    for (int k=0;k<siz_v;k++)
    {
        i = floor(k/taille)%taille);
        j = k%taille;
        matrice[i][j]=v[k];
    }

  8. #8
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par d�faut
    Calculer floor et modulo � chaque it�ration me parait bien peu efficace ...

  9. #9
    Invit�
    Invit�(e)
    Par d�faut
    Bonjour,
    J'ai une approche de r�ponse � Manaliac : le langage C et C++ ne pr�voit pas de tableau multidimensionnels.
    L'�crire Tab[][][] est en fait un tableau de tableaux de tableaux.
    Naturellement c'est exactement la m�me chose que ce qui a �t� dit, mais c'est dit autrement.

  10. #10
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    Par d�faut
    Citation Envoy� par Pierre Dolez Voir le message
    Bonjour,
    J'ai une approche de r�ponse � Manaliac : le langage C et C++ ne pr�voit pas de tableau multidimensionnels.
    L'�crire Tab[][][] est en fait un tableau de tableaux de tableaux.
    Naturellement c'est exactement la m�me chose que ce qui a �t� dit, mais c'est dit autrement.
    A �viter.
    http://cpp.developpez.com/faq/cpp/in...E_matrix_array

Discussions similaires

  1. R�ponses: 1
    Dernier message: 18/05/2010, 15h39
  2. [JNI] passage d'un tableau � 2 dimensions � une m�thod nativ
    Par mmathieu dans le forum Entr�e/Sortie
    R�ponses: 8
    Dernier message: 09/02/2007, 18h52
  3. Passage d'un tableau � deux dimensions
    Par karl3i dans le forum C
    R�ponses: 3
    Dernier message: 20/10/2003, 14h50
  4. Passage d'un tableau par r�f�rence?
    Par sebduth dans le forum C
    R�ponses: 9
    Dernier message: 16/07/2003, 18h32
  5. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et ant�rieur
    R�ponses: 6
    Dernier message: 20/09/2002, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo