Matrice déterminant java
Odenelle
Messages postés
108
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
Bonjour,
J'ai passé plus de 7 heures a essayer de coder cette fonction ( qui est pourtant normalement relativement simple), sans succès, étant au bord de l'abandon je vous soumet mon problème au cas ou quelqu'un sache y répondre.
Je dois crée une fonction qui me renvoie le déterminant d'une matrice n*n, sachant que j'ai crée une structure matrice que voici :
public class mat
{
int col;
int row;
int [][] T ;
}
Ma fonction doit, avec comme seule entrée une structure matrice, me renvoyer le déterminant de cette matrice, elle doit donc être de la forme :
public static int (mat matricedontjeveuxtrouverledeterminant )
{
}
Sachant qu'au préalable, cette matrice aura été remplie grâce a ma méthode (qui utilise la classe scanner) :
public static void remplirmatrice(mat matrice)
{
int row,col;
System.out.println("Saisie d'une matrice :");
System.out.println("Merci de rentrer un nombre de lignes (entier positif < 10) :");
matrice.row = scanner.nextInt();
System.out.println("Merci de rentrer un nombre de colonnes (entier positif < 10) :");
matrice.col = scanner.nextInt();
matrice.T = new int [11][11];
System.out.println("Veuillez maintenant rentrer les valeurs de chaque case de la"
+ " matrice, comprises dans ]-100,100[ et entieres");
for ( row = 0; row < matrice.row; row++)
{
for ( col = 0; col < matrice.col; col++)
{
System.out.print(" mat[" + (row + 1) + "," + (col + 1) + "]=");
matrice.T[row][col] = scanner.nextInt();
}
}
}
Cela peut sembler bêta mais je n'ai absolument pas réussi a faire marcher cette fonction, tous mes essais ( et il y en a eu pas mal ) on été soldé par un échec.
Ce serait vraiment super que quelqu'un puisse m'aider a la faire...
J'ai passé plus de 7 heures a essayer de coder cette fonction ( qui est pourtant normalement relativement simple), sans succès, étant au bord de l'abandon je vous soumet mon problème au cas ou quelqu'un sache y répondre.
Je dois crée une fonction qui me renvoie le déterminant d'une matrice n*n, sachant que j'ai crée une structure matrice que voici :
public class mat
{
int col;
int row;
int [][] T ;
}
Ma fonction doit, avec comme seule entrée une structure matrice, me renvoyer le déterminant de cette matrice, elle doit donc être de la forme :
public static int (mat matricedontjeveuxtrouverledeterminant )
{
}
Sachant qu'au préalable, cette matrice aura été remplie grâce a ma méthode (qui utilise la classe scanner) :
public static void remplirmatrice(mat matrice)
{
int row,col;
System.out.println("Saisie d'une matrice :");
System.out.println("Merci de rentrer un nombre de lignes (entier positif < 10) :");
matrice.row = scanner.nextInt();
System.out.println("Merci de rentrer un nombre de colonnes (entier positif < 10) :");
matrice.col = scanner.nextInt();
matrice.T = new int [11][11];
System.out.println("Veuillez maintenant rentrer les valeurs de chaque case de la"
+ " matrice, comprises dans ]-100,100[ et entieres");
for ( row = 0; row < matrice.row; row++)
{
for ( col = 0; col < matrice.col; col++)
{
System.out.print(" mat[" + (row + 1) + "," + (col + 1) + "]=");
matrice.T[row][col] = scanner.nextInt();
}
}
}
Cela peut sembler bêta mais je n'ai absolument pas réussi a faire marcher cette fonction, tous mes essais ( et il y en a eu pas mal ) on été soldé par un échec.
Ce serait vraiment super que quelqu'un puisse m'aider a la faire...
J'ai suivi ton conseil et voici mon code qui, comme a mon habitude, ne marche pas, saurais tu pourquoi ??
public static int determinant(mat matrice)
{
int determinant = 0;
mat matricenouvelle;
matricenouvelle = new mat();
matricenouvelle.T = new int[matrice.row - 1][matrice.row - 1];
for(int boucle = 1; boucle <= matrice.row - 1; boucle++){
//calcul le cofacteur pour la premi?re coordonnZe de toute les lignes
matricenouvelle.T = cofacteur(matrice);
//calcul le dZterminant de la nouvelle matrice crZZ, lorsque que la matrice atteint une dimension de 3X3
//La mZthode de sarrus est utilisZ autrement on continue avec la mZthode des cofacteurs.
if (matricenouvelle.row - 1 != 3)
determinant += (Math.pow(-1, boucle+1) * matrice.T[boucle][1]) * determinant(matricenouvelle);
else
determinant += (Math.pow(-1, boucle+1) * matrice.T[boucle][1]) * sarrus(matricenouvelle);
}
return determinant;
}
public static int sarrus(mat matrice)
{
int produit = 1;
int determinantsarrus = 0;
int matriceSarrus[][] = new int[4][6];
for(int boucle = 1; boucle <= 3; boucle ++)
for(int boucle1 = 1; boucle1 <= 3; boucle1 ++)
matriceSarrus[boucle][boucle1] = matrice.T[boucle][boucle1];
for (int boucle = 1; boucle <= 3; boucle++)
for (int boucle1 = 4; boucle1 <= 5; boucle1++)
matriceSarrus[boucle][boucle1] = matriceSarrus[boucle][boucle1 - 3];
for (int boucle1 = 0; boucle1 <= 2; boucle1++){
for (int boucle = 1; boucle <= 3; boucle ++)
produit *= matriceSarrus[boucle][boucle + boucle1];
determinantsarrus += produit;
produit = 1;
}
for (int boucle1 = 0; boucle1 <= 2; boucle1++){
for (int boucle = 5, boucle2 = 1; boucle >= 3; boucle --, boucle2 ++)
produit *= matriceSarrus[boucle2][boucle - boucle1];
determinantsarrus -= produit;
produit = 1;
}
return determinantsarrus;
}
public static int[][] cofacteur(mat matrice)
{
int cofacteur[][] = new int[matrice.row - 1][matrice.row - 1];
int boucle1;
int boucle;
for(boucle = 1; boucle < matrice.row; boucle ++ ){
for(boucle1 = 1; boucle1 < matrice.col; boucle1++)
cofacteur[boucle][boucle1] = matrice.T[boucle][boucle1];
for(boucle1 = boucle1; boucle1 <= cofacteur.length - 1; boucle1++)
cofacteur[boucle][boucle1] = matrice.T[boucle][boucle1+1];
}
for(boucle = boucle; boucle <= cofacteur.length - 1; boucle ++ ){
for(boucle1 = 1; boucle1 < matrice.col; boucle1++)
cofacteur[boucle][boucle1] = matrice.T[boucle + 1][boucle1];
for(boucle1 = boucle1; boucle1 <= cofacteur.length - 1; boucle1++)
cofacteur[boucle][boucle1] = matrice.T[boucle + 1][boucle1+1];
}
return cofacteur;
}
Il faut que tu codes des méthodes et des constructeurs pour décomposer tes traitements, c'est plus simple ensuite à trouver les erreurs et à les corriger.
Tu devrais donc avoir un début de code comme ceci :
public Matrice // une classe commence par une majuscule { private final int row; private final int col; private final int tab[][]; // T est une mauvaise idée comme nom de variable, ce n'est pas suffisamment explicite, et de plus les majuscules désignent les constantes. public Matrice(int row,int col) // c'est au constructeur d'initialiser les données { this.row=row; this.col=col; tab = new int[row][col]; } }Comme cela tu peux remplacer ton code précédent par celui-ci :
Evidemment tout cela ne résout pas (encore) ton problème, mais il y a des erreurs un peu partout, et la bonne lisibilité de ton code t'aidera à en résoudre la plupart tout seul. Donc améliore ton code en le découpant en méthodes, pour y voir plus clair, et reviens si des erreurs persistent.
De même tout ce qui est private je ne dois pas utiliser, je n'ai que le droit d'utiliser des fonctions ou procédure avec "Public static" et des structures avec Public class. En effet en objet ce serait bien plus simple mais les exigences de mon projet impliquent que j'utilise une façon de coder assez Bizarre comme tu dis, ce qui, bien sur, ne me simplifie pas la tâche.
En revanche je te suis pour tout ce qui est choix des noms et majuscules pour Constantes, c'est quelque chose que je dois faire et que je corrigerai d'ailleurs une fois mon code fini.
Concernant les erreurs un peu partout, je les situe vraiment mal et je te serai fort reconnaissant si tu pouvais me dire le type d'erreurs que je fait qui nuisent au bon fonctionnement de mon code.
Exemple, dans cofacteur :
Ce tableau t'autorise à utiliser cofacteur[i][j] avec i et j entre 0 et row-2, or tu fais :
for(boucle = 1; boucle < matrice.row; boucle ++ ) for(boucle1 = 1; boucle1 < matrice.col; boucle1++) cofacteur[boucle][boucle1] = ...Tes indices vont ici de 1 à row-1, ils sont donc décalés par rapport à ce que tu dois avoir, et ça va te donner des ArrayOutOfBoundsException...
Remarque : si ton code ne doit pas être objet, tu ne devrais pas avoir new mat();
Saurais-tu pourquoi ? Voici le code :
public static int determinant(mat matrice)
{
int determinant = 0;
mat matricenouvelle;
matricenouvelle = new mat();
matricenouvelle.T = new int[11][11];
for(int boucle = 1; boucle <= matrice.row - 1; boucle++){
//calcule le cofacteur pour la première coordonnée de toute les lignes
matricenouvelle.T= cofacteur(matrice.T,boucle,1);
//calcul le déterminant de la nouvelle matrice crée, lorsque que la matrice atteint une dimension de 3X3
//La méthode de sarrus est utilisée autrement on continue avec la méthode des cofacteurs.
if (matricenouvelle.row - 1 != 3)
determinant += (Math.pow(-1, boucle+1) * matrice.T[boucle][1]) * determinant(matricenouvelle);
else
determinant += (Math.pow(-1, boucle+1) * matrice.T[boucle][1]) * sarrus(matricenouvelle);
}
return determinant;
}
public static int sarrus(mat matrice)
{
int produit = 1;
int determinantsarrus = 0;
int matriceSarrus[][] = new int[2][4];
for(int boucle = 0; boucle < 3; boucle ++)
for(int boucle1 = 0; boucle1 < 3; boucle1 ++)
matriceSarrus[boucle][boucle1] = matrice.T[boucle][boucle1];
for (int boucle = 0; boucle < 3; boucle++)
for (int boucle1 = 0; boucle1 < 2; boucle1++)
matriceSarrus[boucle][boucle1] = matriceSarrus[boucle][boucle1 +3];
for (int boucle1 = 0; boucle1 < 3; boucle1++)
{
for (int boucle = 0; boucle < 3; boucle ++)
produit *= matriceSarrus[boucle][boucle + boucle1];
determinantsarrus += produit;
produit = 1;
}
for (int boucle1 = 0; boucle1 <= 2; boucle1++){
for (int boucle = 5, boucle2 = 1; boucle >= 3; boucle --, boucle2 ++)
produit *= matriceSarrus[boucle2][boucle - boucle1];
determinantsarrus -= produit;
produit = 1;
}
return determinantsarrus;
}
public static int[][] cofacteur(int matrice[][], int ligne, int colonne)
{
int cofacteur[][] = new int[ligne-1][colonne-1];
int boucle1;
int boucle;
for(boucle = 0; boucle < ligne-1; boucle ++ ){
for(boucle1 = 0; boucle1 < colonne-1; boucle1++)
cofacteur[boucle][boucle1] = matrice[boucle][boucle1];
for(boucle1 = 0; boucle1 < cofacteur.length-2 ; boucle1++)
cofacteur[boucle][boucle1] = matrice[boucle][boucle1+1];
}
for(boucle = 0; boucle < cofacteur.length-2 ; boucle ++ ){
for(boucle1 = 0; boucle1 < colonne-1; boucle1++)
cofacteur[boucle][boucle1] = matrice[boucle + 1][boucle1];
for(boucle1 = 0; boucle1 < cofacteur.length-2 ; boucle1++)
cofacteur[boucle][boucle1] = matrice[boucle + 1][boucle1+1];
}
return cofacteur;
}