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

Calcul scientifique Python Discussion :

Erreur while et break traduction matlab à python


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut Erreur while et break traduction matlab à python
    Bonjour, je reviens vers vous, car il y a un truc qui m'échappe dans une portion de programme que j'ai traduit. Voilà lors de ma première traduction du programme matlab ci-dessous la boucle while s'exécutait à l'infini j'ai donc mis un break pour casser la boucle et ça avait l'air de marcher, sauf qu'en fait ça modifie des variables qui se trouve dans le for. Je m'intéresse à i. J'ai printer les variables respectivement sur matlab et sur python pour que vous voyez. Sous matlab c'est ce que je doit avoir avec python. Or dans mon programme python i n'est pas le même (quand je sors du for à la fin). Qu'est-ce qui ne va pas dans ma traduction ?
    Code MATLAB : 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
    %%MATLAB code
    ....
    ii=1;
    %% Mainloop 
    jj = 0;
    while ii > 0 && ii<=floor(count/Nbtot)
        if mod(ii,Ni/(10*Nbtot)) == 0
            jj = jj + 10;
            disp([num2str(jj),' %'])
        end
     
        nu = Ei; %Energy given to nucleus during the all cascade
        xi = []; %positions to calculate the cascade volume
        yi = [];
        delta = [0 0];
        type = 0;
     
        Nbiii = Nbi;
        %impact of the molecule at the surface
        for ll = [1:Nbtot]
            type = floor(3*rand+1); %chose the the ion randomly
            while Nbiii(type) == 0 %if the type chosen is not available
                type = floor(3*rand+1); %chose the the ion randomly
            end
            Nbiii(type) = Nbiii(type)-1; %I remove an atom in the number of atoms in the molecule because I will implant it
            i = Nbtot*(ii-1) + ll; %rank 
            ion(i,5) = type; %ion nb i type
            E = Ei*Mitot(type)/Mmolecule; %energy of the ion
            Mi = Mitot(type);
            Zi = Zitot(type);
     
        %disp(Nbtot)=9.0 9.0 9.0 ....
        %disp(ii)=1 1 1 1 1.. 2 2 2 2 2.... 3 3 3 3...
        %disp(ll)=1.0 2.0 3.0 4.0 5.0 6.0 ...
        %disp(i)=1.0 2.0 3.0 4.0 5.0 6.0 ...
     
        %initialisation - Backscattering
        levelnb = [1 1 1];

    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
    ##PYTHON CODE 
    ....
    ii = 1
    jj=0
     
    while ii > 0 and ii <= np.floor(count / Nbtot):
        if np.remainder(ii,Ni / (10*Nbtot)) == 0:
            jj=jj + 10
            print(str(jj)+'%')
        nu=Ei
        xi=np.array([])
        yi=np.array([])
        delta=np.array(np.hstack((0,0)))
        type=0
        Nbiii=Nbi
        for ll in np.array(np.hstack((np.arange(1, Nbtot+1)))):
            type=np.floor(3*np.random.random() + 1)
            while Nbiii[int(type)-1] == 0:
                type=np.floor(3*np.random.random() + 1)
                break
     
            Nbiii[int(type)-1]=Nbiii[int(type)-1] - 1
            i=Nbtot*(ii - 1) + ll
            ion[int(i)-1,4]=type
            E=np.dot(Ei,Mitot[int(type)-1]) / Mmolecule
            Mi=Mitot[int(type)-1]
            Zi=Zitot[int(type)-1]
            #print(Nbtot)=9.0 9.0 9.0 ....
            #print(ii)=1 1 1 1 1.. 2 2 2 2 2.... 3 3 3 3...
            #print(ll)= 1.0 2.0 3.0 4.0 5.0 6.0 ...
            #print(i)=1.0 2.0 3.0 4.0 5.0 6.0 ...
     
        #print(Nbtot)=9.0 9.0 9.0 ....
        #print(ii)= 1.0 2.0 3.0 4.0 5.0 6.0 ...
        #print(ll)=9.0 9.0 9.0 ....
        #print(i)=9.0 18.0 27.0 36.0...
     
        levelnb = np.array(np.hstack((1, 1, 1)))

  2. #2
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    Le résultat renvoyé est tout à fait normal. A chaque itération de la boucle ii change de valueur et seule la dernière valeur est conservé en mémoire. Donc si vous demander les valeurs de ii après la fin de la boucle, seule la dernière est renvoyée.

    Programmer en python et programmer en Matlab sont deux choses complètement différentes.

    Reprenez en tutoriel sur Python et sur numpy car là, il y a des HORREURS monstrueuses. Allez-y mollo sur les np.hstack.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Mais comment expliquez-vous que matlab ne renvoie pas la même chose ? qu'elle serait l'équivalent alors ? quelles horreurs par ex ?

  4. #4
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    Regardez ce petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import numpy as np
     
    Nbtot = 9.0
     
    for ll in np.array(np.hstack((np.arange(1, Nbtot+1)))):
        print(ll)
     
    for ll in np.arange(1, Nbtot+1):
        print(ll)
    Autre info : les indices en Python commencent à zéro tandis qu'ils débutent à 1 en Matlab. Donc il il a encore moyen de simplifier le code en Python.

    Je connais mal les arcanes de Matlab donc expliquer en détail la différence ne m'est pas possible. Matlab semble conserver un historique des matrises dans certaines situations pour lesquelles Python fonctionne différemment.

    Ensuite, sans autre info sur certaines variables, il m'est impossible de fournir plus d'explications sur les améliorations possibles.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Ah oui ça donne la même chose, merci ! Je me fie à des équivalences et traductions que j'ai trouvé..
    Autre info : les indices en Python commencent à zéro tandis qu'ils débutent à 1 en Matlab. Donc il il a encore moyen de simplifier le code en Python.
    Oui c'est pour ça que à chaque fois j'enlève directement -1, par ex: ion(i,5) <=> ion[int(i)-1,4].

    d'accord pour matlab, je vais chercher en attendant une autre réponse

Discussions similaires

  1. [D2007] Erreur lors de la traduction
    Par paradise dans le forum EDI
    Réponses: 3
    Dernier message: 17/09/2010, 15h32
  2. Erreur UTF8 dans la conversion MATLAB - Scilab
    Par nicollivier dans le forum Scilab
    Réponses: 2
    Dernier message: 26/02/2010, 10h06
  3. Traduction de Python vers PhP
    Par rambc dans le forum Général Python
    Réponses: 0
    Dernier message: 08/06/2009, 19h47
  4. Réponses: 6
    Dernier message: 24/01/2006, 13h31

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