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

Fortran Discussion :

Généraliser un processus à n dimensions


Sujet :

Fortran

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut Généraliser un processus à n dimensions
    Bonjour

    J'ai une question svp :

    En Dim 2, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ((index_x1.le.151).and.(index_x2.le.151)) then
    nb(index_x1+1,index_x2+1)= nb(index_x1+1,index_x2+1)+1
    end if
    en Dim3, ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ((index_x1.le.21).and.(index_x2.le.21).and.(index_x3.le.21)) then
    nb(index_x1+1,index_x2+1,index_x3+1)=nb(index_x1+1,index_x2+1,index_x3+1)+1
    endif
    La question : comment-on peut la généraliser à n dimensions ????

    Merci d'avance

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    je simplifie ma question,
    en dim 2, on a des matrice de type A(n,m)
    en dim 3, on a des matrice de type A(n,m,p)

    je veux generaliser ce processus à une dimension dim, comment on peut faire?!!!!

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par smaq5
    en dim 2, on a des matrice de type A(n,m)
    en dim 3, on a des matrice de type A(n,m,p)
    La solution la plus simple est de lineariser les tableaux multi-dimensionnels et de jouer sur les indices pour 'emuler' un tableau a plusieurs dimensions.
    Dans la suite, je suppose que tu programmes en Fortran (column-major arrays) avec des indices allant de 1 a la valeur maximale.
    Ainsi, A(n,m) devient A(i) avec i = ((m-1)*nmax + n), A etant declare comme etant de dimension A(nmax*mmax).
    En trois dimensions, A(n,m,p) devient A(i) avec i = ((p-1)*mmax + m - 1)*nmax + n). La declaration de A est alors A(nmax*mmax*pmax).
    Il assez simple de generaliser a plus de trois dimensions, mais les formules de calcul d'indice deviennent un peu lourdes.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    r
    Citation Envoyé par DaZumba
    La solution la plus simple est de lineariser les tableaux multi-dimensionnels et de jouer sur les indices pour 'emuler' un tableau a plusieurs dimensions.
    Dans la suite, je suppose que tu programmes en Fortran (column-major arrays) avec des indices allant de 1 a la valeur maximale.
    Ainsi, A(n,m) devient A(i) avec i = ((m-1)*nmax + n), A etant declare comme etant de dimension A(nmax*mmax).
    En trois dimensions, A(n,m,p) devient A(i) avec i = ((p-1)*mmax + m - 1)*nmax + n). La declaration de A est alors A(nmax*mmax*pmax).
    Il assez simple de generaliser a plus de trois dimensions, mais les formules de calcul d'indice deviennent un peu lourdes.
    merci, je vais tester ça, et je te tiens au courant

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par DaZumba
    La solution la plus simple est de lineariser les tableaux multi-dimensionnels et de jouer sur les indices pour 'emuler' un tableau a plusieurs dimensions.
    Dans la suite, je suppose que tu programmes en Fortran (column-major arrays) avec des indices allant de 1 a la valeur maximale.
    Ainsi, A(n,m) devient A(i) avec i = ((m-1)*nmax + n), A etant declare comme etant de dimension A(nmax*mmax).
    En trois dimensions, A(n,m,p) devient A(i) avec i = ((p-1)*mmax + m - 1)*nmax + n). La declaration de A est alors A(nmax*mmax*pmax).
    Il assez simple de generaliser a plus de trois dimensions, mais les formules de calcul d'indice deviennent un peu lourdes.
    excuse moi c'est quoi ton nmax??!!!

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    nmax est la taille de la dimension 'n' (idem pour mmax et pmax).
    J'imagine que tu as declare ton tableau 2d ainsi (Fortran90)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    integer, parameter :: nmax = 5
    integer, parameter :: mmax = 8
    real, dimension(nmax, mmax) :: tableau
    ou en Fortran77
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          integer nmax
          integer mmax
          parameter (nmax = 5, mmax = 8)
          real tableau(nmax, mmax)
    Je te propose de 'lineariser' ce tableau a 2d en le declarant ainsi (Fortran90)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    real, dimension(nmax*mmax) :: tableau
    ou en Fortran77
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          real tableau(nmax*mmax)
    Le nombre d'element est bien le meme, mais on n'y accede pas de la meme facon. Dans le deuxieme cas, on 'simule' les multi-dimensions en utilisant les formules ci-dessus.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    bonjour,
    merci pour vos réponses...
    dans le même cadre, j'ai une autre question:
    maintenant aprés la linéarisation des tableaux, un certain moment il faut faire le chemain inverse: c à d, il faut transformer les tableaux de une dimension à des tableaux de n dimension..
    plus au moin j'ai la solution pour ce probléme...
    le probléme qui se pose maintenant est concerant l'affichage des résultats, j'explique:

    en dim 2: write(33,1001) vx1,vx2,dw_fenetres_x2(ii,jj), dw_fenetres_x1(ii,jj)
    en dim3: write(34,1001) vx1,vx2,vx3,dw_fenetres_x3(ii,jj,kk),
    & dw_fenetres_x2(ii,jj,kk),dw_fenetres_x1(ii,jj,kk)

    sachant que c'est trés important pour mon programme de les afficher de cette maniére et pas dans une seule colonne!!!

    donc si on a une matrice en générale de dimension demandé à l'utilisateur (càd dans le programme on la connais pas), je vois pas comment je peux faire pour l'afficher de cette maniére...

    merci d'avance de votre aide!!

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Il me faudrait plus d'information pour te répondre.
    - les write() ci-dessus sont inclus dans une double ou triple boucle sur ii, jj et kk?
    - quel est le format que tu donnes à la ligne marquée 1001?

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par DaZumba
    Il me faudrait plus d'information pour te répondre.
    - les write() ci-dessus sont inclus dans une double ou triple boucle sur ii, jj et kk?
    - quel est le format que tu donnes à la ligne marquée 1001?

    format, pour la cas de dim=3 :
    1001 format(3(f7.2,1x),3(f15.8,1x))

    et les write sont dans trois boucle (toujours pour le cas de dim=3):

    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
    do ii=1,21
    do jj=1,21
         do kk=1,21
    dv_mult=(nb_pts_moy/float(nb(ii,jj,kk)))**(1./6.)
        dw_fenetres_x1(ii,jj,kk)=dv_mult*0.6
        dw_fenetres_x2(ii,jj,kk)=dv_mult*0.6
            dw_fenetres_x3(ii,jj,kk)=dv_mult*0.6
     
    vx1=(float(ii-1)/5.)
        vx2=(float(jj-1)/5.)
            vx3=(float(kk-1)/5.)
        write(34,1001) vx1,vx2,vx3,dw_fenetres_x3(ii,jj,kk),
    &     dw_fenetres_x2(ii,jj,kk),dw_fenetres_x1(ii,jj,kk)
     
    enddo
    enddo
    enddo


    donc voilà en gros le programme en dim=3
    et comme je vous ai expliqué avant, le probléme est de pouvoir ecrire ce code en dim = m général...

    P.S: le probléme est résolue si write ne revient pas à la ligne à chaque étape,
    càd si j'écrit: do i=1,m
    write(34,1001) vx(i)
    enddo

    est ce que j'aurais les vx(i) sur la même ligne...une chose que j'ai pas encore testé!!!

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    je précise plus ma question, si j'ai un tableau : tab(dim)

    comme je peux faire pour ecrire les éléments de ce tableau sur la même ligne??

    PS: je viens de tester ce que j'ai proposé en haut, ça a pas marché

  11. #11
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    En effet, il faut mettre les vx dans un tableau (de toute facon, lorsqu'on commence a numeroter les variables, c'est qu'un tableau fait aussi bien l'affaire).
    Ensuite, il faut que tu rendes le format 'interactif', c'est a dire qu'il s'adapte au nombre de dimensions.
    Tu peux faire comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          character*24 fmt
          integer nombre_dimension
          parameter(nombre_dimension = 3)
     
          write(fmt,'(a1,i1.1,a10,i1.1,a11)') 
         &          '(', nombre_dimension, '(f7.2,1x),', 
         &          nombre_dimension, '(f15.8,1x))'
    Le format d'ecriture s'est adapte au nombre de dimensions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           write(34,fmt) (vx(i),i=1,nombre_dimension), 
        &       (loc_dw_fenetres_x(i),i=1,nombre_dimension)
    le loc_dw_fenetres_x est une copie locale des tableaux _x1, _x2, _x3 afin de faciliter l'ecriture. Je te laisse faire cette partie...

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par DaZumba
    En effet, il faut mettre les vx dans un tableau (de toute facon, lorsqu'on commence a numeroter les variables, c'est qu'un tableau fait aussi bien l'affaire).
    Ensuite, il faut que tu rendes le format 'interactif', c'est a dire qu'il s'adapte au nombre de dimensions.
    Tu peux faire comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          character*24 fmt
          integer nombre_dimension
          parameter(nombre_dimension = 3)
     
          write(fmt,'(a1,i1.1,a10,i1.1,a11)') 
         &          '(', nombre_dimension, '(f7.2,1x),', 
         &          nombre_dimension, '(f15.8,1x))'
    Le format d'ecriture s'est adapte au nombre de dimensions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           write(34,fmt) (vx(i),i=1,nombre_dimension), 
        &       (loc_dw_fenetres_x(i),i=1,nombre_dimension)
    le loc_dw_fenetres_x est une copie locale des tableaux _x1, _x2, _x3 afin de faciliter l'ecriture. Je te laisse faire cette partie...
    merci beaucoup, ça marche!!!!

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Dans le même cadre je veux savoir tu genéralise :

    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
    open(30,file='/data/ahyoud/fichiers_donnees/X')
    open(31,file='/data/ahyoud/fichiers_donnees/Y')
    open(32,file='/data/ahyoud/fichiers_donnees/Z')
    open(33,file='/data/ahyoud/fichiers_donnees/T')
     
     
    do k=1,nb_tot
    read(30,1002) x
    x1(k)=x
    read(31,1002) x
    x2(k)=x
    read(32,1002) x
    x3(k)=x
    read(33,1002) x
    x4(k)=x
    enddo

    si on a plus de 4 fichier à lire(n fichier ), on fai comment??

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    aussi une autre chose que je vois pas:
    quand un test :
    en dim 2, par exemple: if((x1.le.1).and.(x2.le.1))

    si on a un tableaux de n dim, comment ça marche?!!

    PS: j'ai une idée , c'est d'utiliser des booleen, je l'ai pas encore bien détaillé...

  15. #15
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par smaq5
    si on a plus de 4 fichier à lire(n fichier ), on fai comment??
    Toujours de la meme facon: tu boucles sur les dimensions, eventuellement en mettant a jour le nom du fichier a lire (comme tu l'as fait pour le format d'ecriture ci-dessus).
    Remarque qu'il serait plus simple de regrouper les tableaux x1, x2, x3 etc. en un seul tableau ayant une dimension supplementaire... Mais cela commence a faire beaucoup de dimensions, n'est-ce pas?

    Pour ton test, encore une fois, fait une boucle. Il suffit d'initialiser un booleen et de le mettre a jour a chaque test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    logical can_continue
    ...
    can_continue = .true.
    do n = 1, N
      can_continue = can_continue .or. (x(n) .le. 1.0)
    enddo
    if (can_continue) then
      ...
    endif

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    merci beaucoup

  17. #17
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    dans le même cadre, est ce que tu aurais une idée pr généraliser cette partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    do ii=1,21
    do jj=1,21
         do kk=1,21
     
        vx1=(float(ii-1)/5.)
        vx2=(float(jj-1)/5.)
            vx3=(float(kk-1)/5.)
     
         enddo
    enddo
    enddo
    ce qui est générale, c le nombre des boucle (ça peut être n)

  18. #18
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    C'est assez trivial. D'abord, il faut que tu remarques que, dans ton exemple, tu fais enormement de calculs inutiles. La version 'efficace' est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    do ii=1,21
      vx1=(float(ii-1)/5.)
     
      do jj=1,21
        vx2=(float(jj-1)/5.)
     
         do kk=1,21
            vx3=(float(kk-1)/5.)
     
         enddo ! kk
      enddo !jj
    enddo !ii
    Du coup, il devient evident de generaliser cela. Tu as besoin d'autant de tableaux vx que tu as de dimension. Comme se n'est pas tres flexible, on peut rassemble tous les vx en un seul tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    integer nombre_dimension
    integer dimension_maximale
    parameter(nombre_dimension=3, dimension_maximale=21)
    real vx(nombre_dimension, dimension_maximale)
    ...
    do n = 1, nombre_dimension
      do i = 1, dimension(n) ! doit etre <= a dimension_maximale
        vx(n, i) = ...
      enddo
    enddo ! n
    Evidemment, dans ton exemple, c'est encore plus simple, puisque le calcul est le meme dans toutes les dimensions... Remarque que si l'une des dimensions a un nombre d'element plus petit que dimension_maximale, alors on n'utilisera pas l'ensemble des elements de vx. Mais ce n'est pas tres grave...

  19. #19
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par DaZumba
    C'est assez trivial. D'abord, il faut que tu remarques que, dans ton exemple, tu fais enormement de calculs inutiles. La version 'efficace' est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    do ii=1,21
      vx1=(float(ii-1)/5.)
     
      do jj=1,21
        vx2=(float(jj-1)/5.)
     
         do kk=1,21
            vx3=(float(kk-1)/5.)
     
         enddo ! kk
      enddo !jj
    enddo !ii
    Du coup, il devient evident de generaliser cela. Tu as besoin d'autant de tableaux vx que tu as de dimension. Comme se n'est pas tres flexible, on peut rassemble tous les vx en un seul tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    integer nombre_dimension
    integer dimension_maximale
    parameter(nombre_dimension=3, dimension_maximale=21)
    real vx(nombre_dimension, dimension_maximale)
    ...
    do n = 1, nombre_dimension
      do i = 1, dimension(n) ! doit etre <= a dimension_maximale
        vx(n, i) = ...
      enddo
    enddo ! n
    Evidemment, dans ton exemple, c'est encore plus simple, puisque le calcul est le meme dans toutes les dimensions... Remarque que si l'une des dimensions a un nombre d'element plus petit que dimension_maximale, alors on n'utilisera pas l'ensemble des elements de vx. Mais ce n'est pas tres grave...

    je crois que tu compris ma difficulté pour généraliser ce processuss:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    do ii=1,21
      vx1=(float(ii-1)/5.)
     
      do jj=1,21
        vx2=(float(jj-1)/5.)
     
         do kk=1,21
            vx3=(float(kk-1)/5.)
     
         enddo ! kk
      enddo !jj
    enddo !ii
    le probléme est que la deuxéime partie des égalités des vx(i), je vois pas comment distingué les ii,jj et kk..
    j'espére que c'es plus clair maintenant..et merci en tout cas!!

  20. #20
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    le probléme de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    integer nombre_dimension
    integer dimension_maximale
    parameter(nombre_dimension=3, dimension_maximale=21)
    real vx(nombre_dimension, dimension_maximale)
    ...
    do n = 1, nombre_dimension
      do i = 1, dimension(n) ! doit etre <= a dimension_maximale
        vx(n, i) = ...
      enddo
    enddo ! n
    est qu'il calcul les vx(i,1:dimension(n)) séparément..alors que moi je veux qu'à chaque étape, qui me calcul simultanément les ces vx(i,1:dimension(n))..

    si on essaye d'inverser les boucle, ça marche pas non plus, parce que , comme je t'ai dans le message avant que dans l'autre partie de ces égalités,
    vx(1)=ii
    vx(2)=jj
    vx(3)=kk

    du coup je pense qu'il va falloir ajouter une troisiéme boucle , mais je vois pas encore comment!!!!

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/01/2008, 15h21
  2. cherche un langage permettant de réaliser des applications en trois dimensions
    Par christian123 dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 26/10/2007, 12h26
  3. Réponses: 2
    Dernier message: 05/10/2004, 23h43

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