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

Langage Pascal Discussion :

[LG]multiplication de matrices


Sujet :

Langage Pascal

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [LG]multiplication de matrices
    bonjour tt le monde voila dit fois que j'essaye de programmer une procedure pour multiplier deux matrice si qqun arrive a faire ca ou l'a deja pouvez vous m'aidez svp ??sachant qu'une matrice de taille 2lignes mais nombres de colonne indefini... merci pr votre aide ...

  2. #2
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Il suffit d'utiliser la forumule de multiplication...

    Si (a) et (b) sont deux matrices de tailles m,n et n,p alors si on pose (c) = (a)*(b), on a :

    (c)i,j = Somme(k=1, n, (a)i,k * (b)k,j)

    Bon, transposons tout ça en Pascal à présent. On prend A: array[1..m, 1..n] of Real; (m lignes, n colonnes) et B: array[1..n, 1..p] of Real; (n lignes, p colonnes) et on pose C: array[1..m, 1..p] of Real; (m lignes, p colonnes), ça nous donne donc :

    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
     
    var
      A: array[1..m, 1..n] of Real;
      B: array[1..n, 1..p] of Real;
      C: array[1..m, 1..p] of Real;
      i, j, k: Integer;
      R: Real;
     
    begin
      for i := 1 to m do
        for j := 1 to p do
        begin
          R := 0;
          for k := 1 to n do R := R + A[i, k] * B[k, j];
          C[i, j] := R;
        end;
    end;
    Avec un peu de méthode, on arrive à tout

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  3. #3
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    surtous avec de bon niveau en math
    6*8 =42

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Points : 148
    Points
    148
    Par défaut
    Normalement, ça ne devra poser aucun problème.
    Tu déclare trois matrices (tableau à deux dimensions)
    les deux premières seront les matrices données et la troisième la matrice résultat.

    il suffit de parcourir les deux matrices par une boucle et de faire les multiplications et les sommes nécessaires et d'affecter ça dans l'emplacement correct de la troisième matrice.
    L'union fait la force.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut merci
    merci bien c'est avec joie que je vais faire tourner ca mais j'ai pas mal de mal avec les matrices en faite lol j'ai poste une autres question sur comment inverse une matrice avec le pivot de gauss mais les gens on ete assez sec alors je vais m'arrache sur la tache si je trouve je posterais pour a la fin vous poste un programme de crypto

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Bonjour

    J'ai fait une procédure qui multiplie 2 matrices de taille identique dans une 3e, mais au moment de l'éxecution il y a un RANGE CHECK ERROR. J'ai beau chercher je ne trouve pas d'où ça vient.
    Le type matrice a été crée auparavant de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type matrice = record
            L : integer;
            C : integer;
           data : array [1..Lmax, 1..Cmax] of Zm {Zm est un type crée également, qui au final est un entier}
    Ma procédure est alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procdedure matmult (var a,b: matrice; var c : matrice); 
    var i,j,k,r : integer;
     
    begin
         for i:= 1 to Cmax do
              begin
                   for j:=1 to Lmax do
                       begin
                          r:=0;
                          for k:=1 to Cmax do r:= r + (a.data[i,k]) * (b.data[k,j]);
                          c.data[i,j]:= r;
                       end;
               end;
    end;
    Le Range Check Error intervient apparamment juste après le premier passage dans la boucle k.

    Si vous voyez où peut se trouver l'erreur, ca serait sympa.


  7. #7
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Salut,

    Il y'a une technique que j'utilise souvent pour le débogage, elle consiste à mettre des writeln() partout, histoire de savoir exactement quelle sont les valeurs de mes variables (dans ton cas, il s'agira notemment des indices de boucles).

    Bref, si LMax et CMax sont différents alors tu obtiens l'erreur à cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    r:= r + (a.data[i,k]) * (b.data[k,j]);
    car comme k et i sont compris entre 1 et CMax alors tu essaie d'atteindre l'élément [CMax, CMax] du tableau, opération impossible si CMax > LMax

    Ainsi, successivement tu accedes aux éléments [CMax,CMax], [CMax,LMax] opération impossible si CMax > LMax (impossible d'atteindre l'élément [CMax,CMax]) et impossible aussi si LMax > CMax (impossible d'atteindre [CMax,LMax]) puisque le tableau est déclaré comme array [1..Lmax, 1..Cmax]

    ==> RANGE CHECK ERROR

  8. #8
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Y'a quand même le programme complet juste au-dessus avec des matrices de taille quelconque. Alors après, c'est juste une question du type "je sais adapter du code" ou pas.

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  9. #9
    Membre du Club

    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Points : 55
    Points
    55
    Par défaut
    Il y aune chose que je veux ajouter c'est qu'il ya une condition importante avant de faire la multiplication de deux matrices:
    Le nombre de colone de la 1ére matrice doit etre égale à celui de lignes de la 2ème matrice.

  10. #10
    Membre du Club

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 42
    Points : 47
    Points
    47
    Par défaut
    Salut à tous,

    J'ai lu qu'un certain Volker Strassen(*) avait mis au point un algorithme de calcul du produit de matrices plus rapide que l'algorithme algébrique classique.

    Quelqu'un l'aurait-il testé ?

    A+

    4BIN

    ______________

    (*) "Gaussian Elimination is not Optimal", Numerische Mathematik, N°14(3), pp.354-56, 1969.

  11. #11
    Membre du Club

    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par forbin
    J'ai lu qu'un certain Volker Strassen(*) avait mis au point un algorithme de calcul du produit de matrices plus rapide que l'algorithme algébrique classique.
    Le produit de deux matrices est une définition donc on ne peut pas la changer (voir un peu le cours d'algebre). A mon avis Je pense pas qu'il existe une autre methode de calcule du produit différente de la methode classique (la définition).
    a+

  12. #12
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Il est possible qu'il existe d'autres algorithmes permettant d'améliorer les performances de calcul.
    Quoiqu'il en soit c'est une discussion du forum Algorithmes si tel est le cas.

    Et merci de ne pas déterrer les sujets résolus depuis plus d'un mois

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

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

Discussions similaires

  1. Boost : multiplications de matrice 1000*1000 lentes
    Par bossonm dans le forum Boost
    Réponses: 20
    Dernier message: 12/08/2008, 18h21
  2. Multiplication de matrices
    Par Vince71 dans le forum MATLAB
    Réponses: 3
    Dernier message: 22/04/2008, 15h57
  3. multiplication de matrices
    Par dev0077 dans le forum C++
    Réponses: 4
    Dernier message: 06/10/2007, 15h30
  4. Multiplication de matrices polynomiales
    Par eltentor dans le forum C++
    Réponses: 46
    Dernier message: 14/06/2006, 23h16
  5. Qt/OpenGL et multiplication de matrice
    Par MDiabolo dans le forum OpenGL
    Réponses: 6
    Dernier message: 30/03/2006, 11h08

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