Multiplication de deux matrices

Résolu/Fermé
shinn Messages postés 47 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 8 décembre 2010 - 10 nov. 2010 à 11:29
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 - 5 janv. 2011 à 21:08
Bonjour,

Voilà mon problème, je pense avoir un code correct, cependant j'ai un résultat assez surprenant et je ne vois pas ou est l'erreur.
alors voici mon code


void multimat (int l, int c, int d, int m[10][10], int ma[10][10], int mat[10][10])
{
int i,j,k;


for (i=0; i<l; i++)
{
for (j=0; j<c; j++)
{
for (k=0; k<d; k++)
{
mat[i][j]=m[i][k]*ma[k][j]+mat[i][j];
}
}
}

}



ma fonction main:

multimat (l1,c2,c1,m1,m2,m3);



le problème est dans le résultat:


8 8
111 11

alors que je devrais avoir

8 8
11 11




en me penchant sur ce qui se passe je me rend compte que à un moment dans les calcul pour mon ordinateur
7*1=107, ce qui explique le 111 au lieu de 11.

Si quelqu'un vois une explication je suis preneur.

Merci d'avance à tous

A voir également:

9 réponses

Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
10 nov. 2010 à 11:36
C'est ton algo de multiplication qui a un blème je crois....
Essaye ça :

void multimat (int l, int c, int d, int m[10][10], int ma[10][10], int mat[10][10])
{
	int i,j,k;
	for (i=0; i<l; i++)
	{
		for (j=0; j<c; j++)
		{
			mat[i][j] = 0 ;
			for (k=0; k<d; k++)
			{
				mat[i][j]=m[i][k]*ma[k][j]+mat[i][j];
			}
		}
	}
} 
1
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
11 nov. 2010 à 18:03
alors, déjà les matrices sont des int** (donc int**val, int***vale, int**valeu).
int** représente un tableau d'int.

ensuite pour y accéder, c'est pareil que les tableaux normaux donc val[i][j] par exemple.

void multimat (int l, int c, int d, int **val, int **vale, int **valeu)
{
	int i,j,k;
	for (i=0; i<l; i++)
	{
		for (j=0; j<c; j++)
		{
			valeu[i][j] = 0 ;
			for (k=0; k<d; k++)
			{
				valeu[i][j] = val[i][k]*vale[k][j]+valeu[i][j];
			}
		}
	}
} 
1
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
12 nov. 2010 à 10:37
Alors déjà tu as un problème au niveau de tes malloc : là tu alloues un vecteur en fait (tab[i]) or ce qu'on veut c'est une matrice (tab[i][j]).
Voilà comment il faut faire (bon c'est pas bien je n'ai pas réécrit les tests mais bon il te suffit de les rajouter).
//Pour allouer une matrice 5x5 (par exemple) il faut faire : 
	int **mat ;
	int i ;
	mat = (int**)malloc(5*sizeof(int*));
	for (i=0;i<5;i++)
	{
		mat[i] = (int*)malloc(5*sizeof(int));
	}
	//Et pour la libération
	for(i=0;i<5;i++)
	{
		free(mat[i]);
	}
	free (mat) ;



Bien sûr il faut aussi remplir les matrices car là il n'y a rien dedans avec par exemple :
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
mat[i][j] = ..... ;
}
1
shinn Messages postés 47 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 8 décembre 2010 8
10 nov. 2010 à 11:50
merci beaucoup, en effet je n'avait pas pensé à la réinitialiser à chaque boucle.
ce programme fonctionne parfaitement.
Merci encore de ton aide très précieuse.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
10 nov. 2010 à 11:51
y'a pas de quoi ;)
0
shinn Messages postés 47 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 8 décembre 2010 8
11 nov. 2010 à 17:45
c'est encore moi. voilà j'ai continué mon exercice et je me retrouve devant un autre problème:


void multimat (int l, int c, int d, int *val, int *vale, int *valeu)
{
int i,j,k;
for (i=0; i<l; i++)
{
for (j=0; j<c; j++)
{
*valeu = 0 ;
for (k=0; k<d; k++)
{
*valeu = *val**vale+*valeu;
}
}
}
}

j'ai du faire une allocation dynamique pour mes matrices.
mon problème est que maintenant je ne sait plus du tout comment prendre ce calcul.
Quelqu'un aurait-il une solution à me proposer?
0
shinn Messages postés 47 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 8 décembre 2010 8
12 nov. 2010 à 08:33
voilà j'ai utilisé ta méthode, seulement maintenant lorsque je lance mon programme, ma console beug.
tu me dit de faire des int**, mais lorsque je veut me servir de ces pointeurs, je doit mettre un * devant?

int **pt1,**pt2,**pt3;
pt1 = (int*)malloc(l1*c1*sizeof(int));
pt2 = (int*) malloc (l2*c2*sizeof(int));
pt3 = (int*) malloc (l2*c1*sizeof(int));
if((pt1 == NULL)||(pt2 == NULL)||(pt3 == NULL))
{
printf("Echec allocation memoire");
exit(1);
}
init_val(l1,c1,pt1);
init_val(l2,c2,pt2);
affich_mat(l1,c1,pt1);
affich_mat(l2,c2,pt2);
multimat (l1,c2,c1,pt1,pt2,pt3);
affich_mat(l1,c2,pt3);
free(pt1);
free(pt2);
free(pt3);

En tout cas merci de ton aide
0
shinn Messages postés 47 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 8 décembre 2010 8
Modifié par shinn le 8/12/2010 à 15:43
rebonjour

Je suis désolé du temps de réponse mais j'étais dans une période d'éxam.
Ta technique fontionne bien une fois que on a un peu pratiqué. merci de ton aide.

est-ce que par hasard tu t'y connaîtrais dans l'utilisation des listes chaînées?
Car je suis devant un petit problème et peut-être que tu pourrais m'aider.

Je doit demander à l'utilisateur de rentrer des nom et des temps, pour une course.
On se place à l'arrivée et on note les arrivées au fur et à mesure.

Les concurents arrive t dans l'ordre, et il y a ceux qui se font éliminer lors de la course.

Voilà ce que je veux c'est que lorsque l'utilisateur rentre un nom et un temps différents de 0 alors les informations sont stockées dans une liste chainees appelées "qualifiés" et que lorsque le temps du concurent = 0, les informations sont stockées dans une autre liste chainée.

j'espère que je suis assez clair dans ce que j'explique, si ce n'est pas le cas merci de me le dire.

merci d'avance.
0
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
5 janv. 2011 à 21:08
Aïe aïe aïe !!!!!!

Cette fois c'est moi qui suit vraiment désolée pour le très très très très long temps de réponse....... mais il y a eu exams et surtout INTERNET QUI FAIT DES SIENNES !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Bref galère pour ouvrir une malheureuse page.......

C'est toujours d'actu ?
0