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

Python Discussion :

Manipulations simples de matrice sans module


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut Manipulations simples de matrice sans module
    Bonjour,

    Je programme sous python pour installer mes scripts sur une machine industrielle sur laquelle je ne peux pas installer de module supplémentaire (pour des raisons de politiques informatique de l'entreprise) et donc, je ne peux pas installer Numpy ou numarray (qui ne sont pas déjà présents)...
    Mon problème est le suivant : je dois réaliser des multiplications et inversions de matrice 3*3 (uniquement ça... en fait, il s'agit de matrices de passages d'un repère géométrique à un autre et la formule comporte du U' = P-1 * U...).
    Quelqu'un saurait-il me dire si même pour ces opérations assez simple je dois développer le code de multiplication et inversion moi-même? Je pense en être capable mais si je pouvais m'en passer, ça me plairait pas mal...
    Merci d'avance pour vos réponses,

    Fred

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Sauf erreur de ma part, il n'y a rien dans la bibliothèque standard pour manipuler des matrices. Il faudra donc que tu écrives toi-même les programmes, mais pour des matrices 3*3 ça ne devrait pas poser problème.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut Bon, bah je me lance dès maintenant...
    Merci pour la réponse,
    Du coup, je me lance dès maintenant...
    Si quelqu'un a une idée, je suis quand même preneur.
    Bonne soirée,

    Fred

    PS : j'attends 2-3 jours pour marquer le post "résolu" au cas où...

  4. #4
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut matrices 33 par une classe
    Bonsoir,
    Je propose déja ceci.
    J'ai utilisé un dico avec en paramètre un tuple (ligne,colonne).


    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
     
    class Mat33():
      def __init__(self,ini=0):
        self.val={}
        for coord in [(li,col) for li in [1,2,3] for col in [1,2,3]]:
          self.val[coord]=ini
     
      def aff(self):
        for li in [1,2,3]:
          for col in [1,2,3]:
            print self.val[(li,col)],
          print
        print
     
      def somme(self,ma,mb):
        for coord in [(li,col) for li in [1,2,3] for col in [1,2,3]]:
          #coord=(1,1) (1,2) (1,3) (2,1)..
          self.val[coord]=ma.val[coord]+mb.val[coord]
     
      def prod(self,ma,mb):
        for coord in [(li,col) for li in [1,2,3] for col in [1,2,3]]:
          #coord=(1,1) (1,2) (1,3) (2,1) ...
          self.val[coord]=sum(
            [ma.val[(coord[0],i)]*mb.val[(i,coord[1])] for i in [1,2,3]])
     
     
    a=Mat33(1)
    b=Mat33(2)
    b.val[(3,3)]=5
     
    a.aff()
    b.aff()
     
    c=Mat33()
    c.somme(a,b)
    c.aff()
     
    d=Mat33()
    d.prod(a,b)
    d.aff()

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut Merci beaucoup...
    Bonjour et avant tout, merci pour la réponse...
    Je ne suis pas encore assez familier des dico et tuples pour comprendre l'intégralité de ton code... Mais cela m'a l'air pas mal puissant alors j'essaierai de le décoder ce week-end.
    A première vue, je pense avoir fait un peu la même chose que toi mais avec des boucles imbriquées les unes dans les autres (seulement pour la multiplication de matrices 3*3). Pour être honnête, j'ai un peu transformé un code Pascal trouvé sur le net et ça marche plutôt bien.
    Voici mon code :
    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
     
    import math
     
    a=[[0,0,0],[0,0,0],[0,0,0]]
    b=[[0,0,0],[0,0,0],[0,0,0]]
    c=[[0,0,0],[0,0,0],[0,0,0]]
    m=n=p=len(a[0])
     
    def multiplie(a,b,c):
        for i in range(m):
            for j in range(p):
                R = 0
                for k in range(n):
                    R = R + (a[i])[k]*(b[k])[j]
                (c[i])[j]=R
        return c
    m1=[[12,45,2],[102,5,0],[0,1,0]]
    m2=[[12,1,2],[1,54,8],[4,1,4]]
    res=[[0,0,0],[0,0,0],[0,0,0]]
    multiplie(m1,m2,res)
    print res
    Merci encore, maintenant, il ne me reste plus qu'à inverser une matrice et j'aurai tout ce qu'il me faut...
    Bonne journée,

    Fred

  6. #6
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    PS : Quelqu'un peut-il me dire pourquoi les indentations ne sont pas visibles dans mon code (elle figurent bien lorsque j'écris le message mais disparraissent lorsque je l'édite sur le site --> j'ai mis des "_underscores_"...)
    Tout est expliqué dans le premier message:
    http://www.developpez.net/forums/d45...documentation/

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut Message bien reçu
    Merci Guigui,

    Je ferai plus attention à l'avenir...
    Bonne journée,

    Fred

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par fraid49 Voir le message
    je ne peux pas installer de module supplémentaire (pour des raisons de politiques informatique de l'entreprise) et donc, je ne peux pas installer Numpy ou numarray (qui ne sont pas déjà présents)...
    C'est tout de même étonnant comme politique d'entreprise. Ils préfèrent que leurs collaborateurs passent leur temps à réinventer la roue ?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    C'est tout de même étonnant comme politique d'entreprise. Ils préfèrent que leurs collaborateurs passent leur temps à réinventer la roue ?

    Thierry
    Bonjour Thierry,

    Je comprends bien cette remarque et le terme "politique informatique de l'entreprise" était mal choisi.
    En fait, il s'agit de PCs associés à une machine (système de digitalisation 3D dont le travail/traitement peut être automatisé par des macros python) qui sont présents sur plusieurs sites de l'entreprise et donc :
    - les systèmes doivent être modifiés le moins possible (pour rester conformes à leur état d'origine/d'achat et ne pas risquer de perdre le travail stocké).
    - les PC sont sous linux SUSE 9.1 et personne (ni le service informatique, ni moi) n'est "formé" à l'installation de logiciels/modules sur cette "vieille" version de linux (pour laquelle il est difficile de trouver des packages).
    - une fois que les macros seront considérées comme fiables, elles devront être installées sur tous les postes de digitalisation de l'entreprise et moins il y a de choses à installer, plus on est sûr que c'est stable, répétable (comme installation) et rapide. Mieux vaut juste avoir à copier/coller les scripts/macros sur les différents posts sans avoir à installer des modules qui d'ailleurs ne seront peut-être pas supportés par tous les PC (qui ne sont pas tous identiques...).
    Enfin, je pense que celà me permet également de progresser sur la programmation python et programmer des manipulations simples sur les matrice 3*3 est abordable et peut être fait en quelques heures (même si j'aurai quand même préféré ne pas avoir à le faire... sinon, il n'y aurait pas ce post...).
    Bref, je n'ai pas trop le choix sur ce coup là mais je ne suis pas surpri qu'on me pose la question.
    Bonne journée,

    Fred

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Juste pour info, je n'ai pas plus avancé sur un script de calcul de matrice car en fait, la transposée d'une matrice de passage (entre deux bases orthonormées!!! Cf message de Oiffrig ci-après!) est égale à son inverse (et inversement - il s'agit d'une des propriétés des matrices de passage entre 2 bases orthonormées...).
    Et comme il y a déjà un script présenté de multiplication de matrice, je pense que c'est résolu!!!
    Tcho,

    Fred

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Attention à ce que tu dis là ! En général l'inverse d'une matrice n'est pas sa transposée. La dénomination "matrice de passage" n'a pas d'intérêt si l'on ne précise pas entre quelles bases, toute matrice inversible est matrice de passage d'une base à une autre. L'inverse est égale à la transposée si la matrice est orthogonale (matrice de passage entre 2 bases orthonormales).

    Pour t'en persuader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A = [[ 1 0 1 ]
         [ 0 1 0 ]
         [ 0 0 1 ]]
     
    A^-1 = [[ 1 0 -1 ]
            [ 0 1  0 ]
            [ 0 0  1 ]]
    Mais encore une fois, comme dit, inverser une matrice 3*3 ne pose pas de problème, surtout en se servant de la comatrice.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut Toutes mes confuses
    Oups, oui, tu as raison, j'ai un peu simplifié le truc : en effet, ce que je dis n'est vrai que pour les matrices de passage entre 2 bases orthonormées!!! (C'était mon cas, j'ai oublié de préciser)... Merci pour la précision, j'ai corrigé dans le message!

    Fred

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

Discussions similaires

  1. Comparaison de deux matrices sans boucle for
    Par zicos dans le forum MATLAB
    Réponses: 8
    Dernier message: 04/05/2007, 18h16
  2. API de manipulation simple de PDF
    Par Nicolas_75 dans le forum Documents
    Réponses: 3
    Dernier message: 18/02/2007, 11h05
  3. [Dojo] Simple data grid sans appel Ajax
    Par Den's dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 14/12/2006, 08h23
  4. telnet et ftp sans modules Net::Telnet et Net::Ftp
    Par jmarclacroix dans le forum Modules
    Réponses: 2
    Dernier message: 05/05/2006, 20h14
  5. [VB.NET] Manipuler une feuille via un module
    Par dinbougre dans le forum Windows Forms
    Réponses: 8
    Dernier message: 13/01/2005, 17h15

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