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

MATLAB Discussion :

Problème de compréhension d'un jeu de Conway,automate cellulaire


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Problème de compréhension d'un jeu de Conway,automate cellulaire
    Bonjour à tous,

    J'essaie de me familiariser avec matlab pour des raisons professionnels et là je bloque vraiment sur la signification précise d'une ligne de code.
    Le code en question est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    len=100; GRID=int8(rand(len,len)); %taille de la matrice/matrice
    up=[2:len 1]; down=[len 1:len-1]; %up(2,3,...,len,1)/down=(len,1,2,...,len-1)
    colormap(autumn(2));%couleur des cellules
    for i=1:10000 %nb de cycles
        neighbours=GRID(up,:)+GRID(down,:)+GRID(:,up)+GRID(:,down)+...  %grid(up,:) tous les éléments de la ligne up??
        GRID(up,up)+GRID(up,down)+GRID(down,up)+GRID(down,down);
        GRID = neighbours==3 | GRID & neighbours==2;
        image(GRID*2); pause(0.04);
    end
    Le code permet de simuler un jeu de la vie. J'arrive à comprendre le fonctionnement du programme puisque je trouve les mêmes résultats sur papier.
    Néanmoins je ne saisis pas deux choses:
    -A quoi correspondent exactement les termes représentant les voisins? En effet, si on prends en exemple le premier terme des voisins à savoir grid(up,: ),grid(1,: ) signifierait tous les éléments de la ligne 1 mais là up est un vecteur. Alors ça marche si l'on considère par exemple pour la cellule (1,2) le premier terme de 'up' pour le numéro de ligne donc 2 et 2 pour numéro de colonne(on prend le numéro correspondant de la cellule d'origine lorsqu'on a ":").En procédant de cette manière on retrouve les résultats mais j'aurai voulu une explication rigoureuse.
    Pourriez-vous m'aider à démêler tout ça?

    Merci d'avance à vous tous.

    PS1: j'espère avoir été clair dans mes explications
    PS2: petit rappel des règles du jeu de la vie:
    http://fr.wikipedia.org/wiki/Jeu_de_la_vie

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,


    Pour :
    Comme tu l'a dit up est un vecteur de la forme :
    [2 3 4 5 ... len-1 len 1]
    donc dans up la seule chose qui a été faite, c'est de mettre le 1 à la fin.
    Ainsi lorsque l'on fait :
    on sélectionne toutes les lignes et toutes les colonnes mais la première ligne de GRID devient la dernière du nouveau tableau que l'on créée.

    Est-ce que j'ai été suffisamment clair? Est-ce que cela répond à ta question?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Alors oui tu réponds à ma question, néanmoins je ne comprend pas bien désolé.
    En effet, je retiens de ta réponse que les termes grid(.,.) sont des matrices. Or on veut récupérer des entier(0 ou 1).
    Donc je ne comprends plus l'équation neighbours .
    Pourrais-tu me clarifier cela s'il te plait.
    Merci dans tous les cas pour ta première réponse

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Désolé pour le double post, mais je viens de réfléchir sur papier et je crois avoir trouvé.
    En fait c'est comme si on faisait un glissement a chaque fois pour qu'au final on ait dans chaque case la somme des voisins. Donc en analysant la nouvelle valeur de la case, on peut savoir combien de voisins étaient à un.
    Par contre c'est fort que matlab puisse faire ça avec si peu de code.

    Une autre chose, pour cette ligne:
    GRID = neighbours==3 | GRID & neighbours==2
    Comment ça marche réellement? c'est comme si matlab foncionnait à logique positive, donc la cellule est a un si grid est à un et voisins est à deux ou grid est à 0 et voisin est à 3. Pourtant je vois pas d'ou peut venir cette logique?

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par élève6018 Voir le message
    Désolé pour le double post, mais je viens de réfléchir sur papier et je crois avoir trouvé.
    En fait c'est comme si on faisait un glissement a chaque fois pour qu'au final on ait dans chaque case la somme des voisins. Donc en analysant la nouvelle valeur de la case, on peut savoir combien de voisins étaient à un.
    Par contre c'est fort que matlab puisse faire ça avec si peu de code.
    J'étais en train de préparer une super explication mais si tu as compris, c'est tant mieux!

    Citation Envoyé par élève6018 Voir le message
    Une autre chose, pour cette ligne:
    GRID = neighbours==3 | GRID & neighbours==2
    Comment ça marche réellement? c'est comme si matlab foncionnait à logique positive, donc la cellule est a un si grid est à un et voisins est à deux ou grid est à 0 et voisin est à 3. Pourtant je vois pas d'ou peut venir cette logique?
    Non, en fait les 2 conditions sont :
    - voisin est à 3
    - la cellule est a un si grid est à un et voisins est à deux

    Dans la première il n'y a pas de condition sur grid.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ah mince tu preparais l'explication. J'ai presque envie de dire désolé d'avoir compris.
    Une dernière chose: pour la ligne:
    GRID = neighbours==3 | GRID & neighbours==2
    il n'y a que des conditions et pas d'actions, comment Matlab sait qu'il faut mettre la case a "1".

    Dans tous les cas c'est chouette de ta part de predre de le temps de m'expliquer comme tu le fais. Surtout que mes questions peuvent paraitre stupides. Mais disons que j'ai du mal à saisir "l'etat d'esprit" de la programmation sous Matlab. C'est pas du tout comme le c par exemple je trouve.

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par élève6018 Voir le message
    Ah mince tu preparais l'explication. J'ai presque envie de dire désolé d'avoir compris.
    Une dernière chose: pour la ligne:
    GRID = neighbours==3 | GRID & neighbours==2
    il n'y a que des conditions et pas d'actions, comment Matlab sait qu'il faut mettre la case a "1".
    En fait c'est juste des opérateurs logiques. Lorsque tu les utilises matalab analyse juste les conditions et renvoie un booléen. L'avantage de Matalb est de pouvoir appliquer des opérations logiques directement sur des matrices (là j'ai un petit doute, je crois que cela n'est pas possible directement en C avec les opérateurs de référence).

    Analyse l'exemple suivant pour comprendre ce qui se passe :
    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
    >> neighbours = [1 3 4; 4 7 2]
     
    neighbours =
     
         1     3     4
         4     7     2
     
    >> GRID = [0 0 0;0 0 1]
     
    GRID =
     
         0     0     0
         0     0     1
     
    >> neighbours==3
     
    ans =
     
         0     1     0
         0     0     0
     
    >> GRID & neighbours==2
     
    ans =
     
         0     0     0
         0     0     1
     
    >> neighbours==3 | GRID & neighbours==2
     
    ans =
     
         0     1     0
         0     0     1
    Après les règles des opérateurs logiques sont les mêmes qu'en C : on commence par les "et logique" puis on traite les "ou logique".

    Citation Envoyé par élève6018 Voir le message
    Mais disons que j'ai du mal à saisir "l'etat d'esprit" de la programmation sous Matlab. C'est pas du tout comme le c par exemple je trouve.
    Oui mais tu verras, ça vient vite, il suffit aussi de savoir ou chercher... D'ailleurs, n'hésite pas à te référer à la doc de matlab qui est très complète et je te conseil de consulter la faq ainsi que les tutoriels

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour ces dernières explications. Et l'exemple a bien illustré tes propos.
    On sera peut etre amener a se retrouver sur ce forum, le moins possible j'espere .

    Encore merci pour ton temps,

    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] problème de compréhension
    Par Sylvester dans le forum Général Java
    Réponses: 18
    Dernier message: 21/07/2005, 10h16
  2. Réponses: 5
    Dernier message: 11/04/2005, 11h21
  3. [C#] Problème de compréhension de System.Convert ET Provider
    Par papouAlain dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/11/2004, 22h52
  4. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 16h09
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 23h07

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