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

Java Discussion :

Multiplication des matrices


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Collégien
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Par défaut Multiplication des matrices
    Bonjour,

    J'ai un problème dans mon code de multiplication des 2 matrices avec les threads tel que chaque thread calcule une ligne

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    class MatriceOpx extends Thread {
      static int matrice1[][];
      static int vecter[][];
      static int matrice2[][];
      static int resultat[][];
      static int n;
      static int m;
     
      static int th;
     
      MatriceOpx(int i) {
        th = i;
        this.start();
      }
     
      @Override
      public void run() {
        int i, j, rang;
     
        for (rang = 0; rang < n; rang++) {
          if (vecter[rang][0] == 0) {
            for (i = 0; i < n; i++) {
              resultat[rang][i] = 0;
              for (j = 0; j < n; j++) {
                resultat[rang][i] = resultat[rang][i] + matrice1[rang][j] * matrice2[j][i];
              }
            }
            vecter[rang][0] = 1;
            vecter[rang][1] = th;
          }
        }
      }
     
      public static void main(String args[]) {
        int i, j, k;
     
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("<-- Multiplication de 2 matrices carres des entiers naturels --> ");
        Scanner e1 = new Scanner(System.in);
        n = e1.nextInt();
     
        System.out.println("Veuillez introduiez le nombre de lignes et de colonnes des matrices : ");
     
        System.out.println("Veuillez introduiez le nombre de thread:");
     
        try {
          m = e1.nextInt();
        } catch (Exception e) {
        }
     
        if (m > n) {
          System.out.print("Non, m <= n");
          System.out.print("Veuillez introduiez le nombre de thread:");
          try {
            m = e1.nextInt();
          } catch (Exception e) {
          }
        }
        matrice1 = new int[n][n];
        matrice2 = new int[n][n];
        resultat = new int[n][n];
        vecter = new int[n][2];
     
        for (i = 0; i < n; i++) {
          vecter[i][0] = 0;
        }
     
        System.out.println("Veuillez remplir les cases de la matrice une : ");
        for (i = 0; i < n; i++) {
          for (j = 0; j < n; j++) {
            try {
              matrice1[i][j] = 150;
            } catch (Exception e) {
            }
          }
        }
        System.out.println("Veuillez remplir les cases de la matrice deux : ");
        for (i = 0; i < n; i++) {
          for (j = 0; j < n; j++) {
            try {
              matrice2[i][j] = 50;
            } catch (Exception e) {
            }
          }
        }
        MatriceOpx mat[] = new MatriceOpx[m];
        for (i = 0; i < m; i++) {
          mat[i] = new MatriceOpx(i);
        }
     
        try {
          for (i = 0; i < m; i++) {
            mat[i].join();
          }
        } catch (Exception e) {
        }
     
        System.out.println("Ci dessous le resultat :");
     
        for (i = 0; i < n; i++) {
          k = i + 1;
          System.out.println("le ligne numéro:" + k + " dans la matrice resultat fait le calcule à l'aide de thread N° : " + vecter[i][1] + "");
          for (j = 0; j < n; j++) {
            System.out.println(resultat[i][j]);
          }
        }
      }
     
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Bonjour,

    Essaye d'abord de reformater tes sources, est-ce que tu utilises un IDE ?

    Ensuite, quel problème observes-tu ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre actif
    Femme Profil pro
    Collégien
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Par défaut
    j'ai utilisé eclipse
    le probléme c'est que un thread calcule plusieurs ligne .
    moi j'ai besoin que chaque thread calcule un ligne

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Si tu utilises Eclipse, tu peux formater le code à l'aide avec la combinaison "CTRL + SHIFT + F". Je te conseille également la lecture de :
    1. Les raccourcis claviers indispensables pour la programmation Java (FAQ Eclipse)
    2. Les raccourcis d'Eclipse, par Thierry Leriche-Dessirier


    Quelques autres conseils :
    1. Quand tu as un problème essayes d'aller au plus simple. Ici le remplissage de la matrice ne vient que décourager les intervenants. Au delà de cela, je te conseille également d'encapsuler dans une méthode spécifique tout ce qui concerne la saisie. Cela simplifiera également ta propre relecture.
    2. Pourquoi avoir mis des try-catch dans tous les sens si c'est pour ignorer l'exception ? Ca nuit également fortement à la relecture.
    3. Utilises des noms de variables plus explicites. Par exemple, "m" est le nombre de thread mais sans relecture attentive, il est impossible de s'en rendre compte.
    4. Surtout quand tu poses un exemple, penses à nettoyer le code. Par exemple, "br" n'est jamais utilisé.


    Maintenant les remarques :
    • Tu affiches le message "Veuillez introduiez le nombre de lignes et de colonnes des matrices : " après avoir demandé la saisie n = e1.nextInt();
    • Tu peux remplacer le code suivant par une boucle "do-while" :
      Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      System.out.println("Veuillez saisir le nombre de thread:");
      m = in.nextInt();
      if (m > n) {
         System.out.print("Non, m <= n");
         System.out.print("Veuillez saisir le nombre de thread:");
         m = in.nextInt();
      }
    • Si tu veux un thread par ligne, pourquoi demander le nombre de thread ? Sinon utilises un pool de thread. Consulte l'article Introduction à la programmation concurrente en Java, par Zenika.
    • Inutile d'initialiser les valeurs de "vecter" à 0, c'est déjà le cas par défaut.
    • Inutile de déclarer tes compteurs de boucle, tu peux le faire directement dans le for


    Voici le code nettoyé :
    Code Java : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    class MatriceOpx extends Thread {
      static int     dimension = 2;
      static int[][] matrice1  = new int[dimension][dimension];
      static int[][] matrice2  = new int[dimension][dimension];
      static int[][] resultat  = new int[dimension][dimension];
      static int[][] vecter    = new int[dimension][2];
     
      static int th;
     
      MatriceOpx(int i) {
        th = i;
        this.start();
      }
     
      @Override
      public void run() {
        for (int rang = 0; rang < dimension; rang++) {
          if (vecter[rang][0] == 0) {
            for (int i = 0; i < dimension; i++) {
              resultat[rang][i] = 0;
              for (int j = 0; j < dimension; j++) {
                resultat[rang][i] = resultat[rang][i] + matrice1[rang][j] * matrice2[j][i];
              }
            }
            vecter[rang][0] = 1;
            vecter[rang][1] = th;
          }
        }
      }
     
      public static void main(String args[]) throws InterruptedException {
        System.out.println("<-- Multiplication de 2 matrices carres des entiers naturels --> ");
        // Remplissage matrice
        for (int i = 0; i < dimension; i++) {
          for (int j = 0; j < dimension; j++) {
            matrice1[i][j] = 1;
            matrice2[i][j] = 1;
          }
        }
     
        // Execution des threads
        MatriceOpx mat[] = new MatriceOpx[dimension];
        for (int i = 0; i < dimension; i++) {
          mat[i] = new MatriceOpx(i);
        }
        for (int i = 0; i < dimension; i++) {
          mat[i].join();
        }
     
        // Résultat
        System.out.println("Ci dessous le resultat :");
        for (int i = 0; i < dimension; i++) {
          System.out.println("le ligne numéro:" + i + " dans la matrice resultat fait le calcule à l'aide de thread N° : " + vecter[i][1] + "");
        }
        for (int i = 0; i < dimension; i++) {
          System.out.print("[ ");
          for (int j = 0; j < dimension; j++) {
            System.out.format("%02d ", resultat[i][j]);
          }
          System.out.println("]");
        }
      }
    }

    Quelques questions maintenant :
    1. A quoi sert et que représente l'attribut static "th" ?
    2. A quoi sert et que représente l'attribut static "vecter" ?
    3. A quoi sert et que représente la variable "rang" dans la méthode "run()" ?

    Réfléchis bien à ces questions, ca devrait t'aider à trouver tes réponses
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. multiplication parallele des matrices
    Par zerhem dans le forum Débuter avec Java
    Réponses: 13
    Dernier message: 23/04/2013, 17h06
  2. [Débutant] la multiplication des matrices
    Par brf1982 dans le forum MATLAB
    Réponses: 6
    Dernier message: 20/10/2012, 18h35
  3. multiplication des colonnes d'un matrice
    Par hibouchka dans le forum MATLAB
    Réponses: 2
    Dernier message: 21/03/2011, 22h37
  4. Ordre dans la multiplication des matrices
    Par Balmung dans le forum OpenGL
    Réponses: 4
    Dernier message: 06/07/2009, 17h51
  5. Multiplication de matrices contenues dans des cellules
    Par jeanlourme dans le forum MATLAB
    Réponses: 1
    Dernier message: 08/05/2009, 15h32

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