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

Algorithmes et structures de données Discussion :

Problème: produit matriciel


Sujet :

Algorithmes et structures de données

  1. #1
    Membre actif
    Problème: produit matriciel
    Je suis en train de créer un petit programme java qui effectue des opérations sur les matrices (calcul de déterminant,, calcul de la matrice inverse, somme de deux matrices, produit de deux matrices et résolution de systèmes linéaires). Je calle à la partie "Produit matriciel", je n'ai aucune idée de comment je vais m'y prendre. J'ai la 1ere matrice et la deuxième matrice (qui sont soit entrées soit générées). A partir de ces deux là, j'aimerai effectuer le produit matriciel. Il y a trop de paramètres (les lignes et colonnes de chacune d'entre elles) et je m'y perds. Mes matrices sont carrées de genre 2x2 ou 3x3 en fonction du choix de l'utilisateur. J'ai beau essayer, je n'y arrive pas. Pourriez-vous m'aider? Un grand merci d'avance.

    P.S.: J'ai reposté ici suite au conseil de VitamineC

    J'en profite pour poster mon code actuel.

    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
     
    //Sous fonction: calcule le produit de deux matrices
     	static double[][] produitMatrices (double matrice1[][], double matrice2 [][], int taille){
     		double produit[][];//création du tableau produit
     		produit=new double[taille][taille];//paramètres du tableau produit
     		int l,c, k;//variable de ligne, colonne et k
     
           	for( l=0 ; l<taille ; l++){
            	for ( c=0 ; c<taille ; c++){
            		// calcule de la case (M1.M2)[i][j]
            		produit[l][c] = 0 ;
            		for(k=0;k<taille;k++){
            			produit[l][c] = produit[l][c] + matrice1[l][k] * matrice2[k][c];
                	}
                }
            }
            return produit;
        }
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  2. #2
    Invité(e)
    Invité(e)
    Bonsoir
    Quel est le problème exactement ?
    J'ai ressorti mes formules de calcul matriciel le calcul me semble juste.

  3. #3
    Nouveau membre du Club
    Effectivement, ta formule pour calculer le produit matriciel est excellente. Il ne devrait pas y avoir d'erreur d'algorithme dans ton code. J'ai moi aussi ressorti mes notes sur le produit de deux matrices et c'est exactement ce que tu as marqué.

    Si tu as un problème avec cette formule, soit plus précis, parce que je n'en voit pas !

  4. #4
    Membre actif
    Quand je fais tourner le programme, il ne m'affiche pas tout les résultats.

    Voici un exemple de résultat:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Matrice1:
     10    1     0
    -15    0    17
      6  -12    11
     
    Matrice2:
    -11    11   -18
      4     -5    18
      9    -18    -4
     
    Résultat:
     
    -15  -72


    Je ne vois pas d'où vient le problème.

    En tout cas, merci d'avance pour votre coup de pouce
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  5. #5
    Membre habitué
    A mon avis ce n'est pas un problème d'algorithme comme ta formule est bonne, peut-être un problème avec ta façon d'utiliser la mémoire dynamiquement, mais je ne fais pas de Java donc je ne peux pas t'aider.
    " Tout homme est digne d'un parapluie." Stavroguine dans Les Démons de Dostoïevski.

  6. #6
    Membre actif
    ouais, c'est probablement ça, mais je ne trouve toujours pas de quelle ligne de code, ce problème vient. J'ai fait un peu du même type avec la partie qui traite la somme et ça marche impec. Je ne comprends vraiment pas, j'ai beau me relire et refaire des tests, il manque à chaque fois des éléments et ce sont pas toujours les mêmes...
    Merci d'avance si vous trouvez la solution. Je peux vous copier coller le reste necessaire du programme, mais c'est assez long avec toutes mes sous fonctions,...
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  7. #7
    Nouveau membre du Club
    Taille vaut quoi lorsque tu exécutes ta fonction ?

    Et voici un algo que je te proposes :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Fonction AFoisB(A, B, m, p, n)
       Pour i <- 1 à m
          Pour j <- 1 à n
             C[i,j] <- 0
             Pour k <- 1 à p
                C[i,j] <- C[i,j] + A[i,k] * B[k,j]
             Fin Pour
          Fin Pour
       Fin Pour
       Retourner C
    Fin Fonction


    A = Matrice de taille m X p
    B = Matrice de taille p X n

    Voilà. Tu peux essayer cette algo en Java pour voir...

  8. #8
    Membre actif
    Taille = 2 ou 3 en fonction de l'utilisateur, ce sont des matrices carrées.

    Je vais tester ton algorithme, je te tiens au jus. Merci d'avance
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  9. #9
    Membre actif
    Ton algorithme fonctionne pour tout les types de matrices, pour la fonction produit, je me suis limité au matrices carrées, mais pour la partie résolution de système, j'en aurai besoin. UN grand merci
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  10. #10
    Nouveau membre du Club
    Et est-ce que ta matrice C est complète?

  11. #11
    Membre actif
    Je viens de faire plusieurs tests, elle n'est toujours pas complète, je comprends pas, le raisonnement est bon mais il n'affiche pas tout les éléments de la matrice.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  12. #12
    Nouveau membre du Club
    Dans ce cas, es-tu certain que tu fais afficher ta matrice comme il faut?

  13. #13
    Membre actif
    J'utilise la même méthode que quand je fais l'affichage de la somme des matrices, du résultat de l'inverse,... donc logiquement, comme ça marche avec les autres fonctions, pourquoi pas celle-ci
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  14. #14
    Membre du Club
    Salut,


    Tu pourrais essayer de faire une fontion avec des matrices de taille fixée pour vérifier.

  15. #15
    Membre actif
    Bonjour,
    C'est-à-dire? Pour le moment je fais mes tests avec des matrices carrées 2x2 ou 3x3.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  16. #16
    Membre du Club
    Ce message n'a pas pu être affiché car il comporte des erreurs.

  17. #17
    Membre actif
    Voici:

    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
     
    //Sous fonction: aligne et écrit la matrice
     	static void ecrireMatrice(double[][] matrice, int taille){
     		int l,c;//variables de ligne et colonne
     
     		for (l=0; l<taille; l++){
     			for (c=0; c<taille; c++){
     
     				//Arrondis les différents éléments de la matrice à 3 chiffres après la virgule.
     				NumberFormat formatter = NumberFormat.getNumberInstance();
     				formatter.setMaximumFractionDigits(3);
     				String mat=formatter.format(matrice[l][c]);
     
     				//Affiche en fonction du nombre de caractères de l'élément
     				if ((matrice[l][c]> -99.9 && matrice[l][c]<=-10.0)|| (matrice[l][c]>= 10.0 && matrice[l][c]<99.9)){
     					if(matrice[l][c]<0){
     						System.out.print(mat+"   ");
     					}
     					if(matrice[l][c]>0){
     						System.out.print(" "+mat+"   ");
     					}
     				}
     
     				if (matrice[l][c]> -9.9 && matrice[l][c]<= 9.9){
     					if(matrice[l][c]<0){
     						System.out.print(" "+mat+"   ");
     					}
     					if(matrice[l][c]>=0){
     						System.out.print("  "+mat+"   ");
     					}
     				}
     			}
     			System.out.print("\n");
     		}
     		System.out.println("\n");
     	}


    Merci d'avance
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  18. #18
    Membre du Club
    Le probleme viens de la

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
      if ( ( matrice[l][c] > - 99.9 && matrice[l][c] <= -10.0 ) || (matrice[l][c] >= 10.0 && matrice[l][c] < 99.9 ) ) {


    dans tes conditions if tu ne prends pas en comptes les nombres superieurs à 99.9 et les nombre inferieurs à -99.9

    donc au lieu d'avoir

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    -106.0 105.0 -162.0 
     
    318.0 -471.0 202.0 
     
    -15.0 -72.0 -368.0


    tu te retrouves avec
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    -15 -72

    qui sont les seuls nombre compris entre -99.9 et 99.9

    tu ne prends egalement pas en compte les nombre compris entre 9.9 et 10.0

    ça doit marcher avec ça mais si le fait que matrice[l][c] <|99.9| alors rajoute des conditions
    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
     
    static void ecrireMatrice(double[][] matrice, int taille){ 
           int l,c;//variables de ligne et colonne 
     
           for (l=0; l<taille; l++){ 
              for (c=0; c<taille; c++){ 
     
                 //Arrondis les différents éléments de la matrice à 3 chiffres après la virgule. 
                 NumberFormat formatter = NumberFormat.getNumberInstance(); 
                 formatter.setMaximumFractionDigits(3); 
                 String mat=formatter.format(matrice[l][c]); 
     
                 //Affiche en fonction du nombre de caractères de l'élément 
                 if ( ( matrice[l][c] <= -10.0 ) || (matrice[l][c] >= 10.0  ) ) { 
                    if(matrice[l][c]<0){ 
                       System.out.print( mat + "   " ); 
                    } 
                    if(matrice[l][c]>0){ 
                       System.out.print(" "+mat+"   "); 
                    } 
                 }
     
                 if (matrice[l][c]> -10.0 && matrice[l][c]<= 10.0){ 
                    if(matrice[l][c]<0){ 
                       System.out.print(" "+mat+"   "); 
                    } 
                    if(matrice[l][c]>=0){ 
                       System.out.print("  "+mat+"   "); 
                    } 
                 } 
              } 
              System.out.print("\n"); 
           } 
           System.out.println("\n"); 
        }

  19. #19
    Membre actif
    Merci beaucoup, ça marche Je n'y avais pas pensé, je génerai mes matrice de -20 à 20, pour les sommes, ça ne posait évidemment pas de problèmes mais pour les produits, c'est une autre affaire. Un grand merci
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  20. #20
    Membre du Club
    de rien oubli pas le tag resolu a +