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
| matrice *MultiplierrMatrices2(matrice *m1,matrice *m2,matrice *mul){
int i,j, val, nbZeroGauche, *nbZeroHaut, *XCel1, *XCel2;
double valpdt;
cellule *cel, **celHaut=NULL, *celPrec=NULL;
/* on test que les matrices aient le même format sinon on retourn NULL */
if(m1->tailleLigne != m2->tailleColonne || m1->tailleLigne != m2->tailleColonne)
return NULL;
mul->tailleLigne=m1->tailleLigne;
mul->tailleColonne=m2->tailleColonne;
mul->ligne=(cellule**)malloc(sizeof(cellule*)*mul->tailleLigne);
mul->colonne = (cellule**)malloc(sizeof(cellule*)*mul->tailleColonne);
nbZeroHaut = (int*)malloc(sizeof(int)*mul->tailleColonne);
celHaut = (cellule**)malloc(sizeof(cellule*)*mul->tailleColonne);
for(i=0;i<mul->tailleColonne;i++){
nbZeroHaut[i]=0;
celHaut[i] = NULL;
}
for(i=0;i<mul->tailleLigne; i++){
nbZeroGauche = 0;/* permet de retenir le nb de 0 entre la prochaine cellule et la cellule la plus à doirte de la ligne */
celPrec = NULL;/* permet de retenir la dernière celulle la plus à droite dans la ligne */
for(j=0;j<mul->tailleColonne;j++){
valpdt = valeurCellule(m1, i, j) * valeurCellule(m2, i, j) + valeurCellule(m1, i, j+1) * valeurCellule(m2, i, j+1);
if(valpdt==0){/* on retient qu'il ne faut pas ajouter de cellule et on ajoute un zéro */
nbZeroHaut[j]++;
nbZeroGauche++;
}else{/* on ajoute la cellule dans la matrice produit */
cel = (cellule*)malloc(sizeof(cellule));
cel->suivanteBas = cel->suivanteDroite = NULL;
cel->valeur = valpdt;
cel->nbZeroGauche = nbZeroGauche;
cel->nbZeroHaut = nbZeroHaut[j];
nbZeroGauche = 0;
nbZeroHaut[j] = 0;
if(celHaut[j]){/* si on a retenu qu'on a déjà fait une cellule dans cette colonne, on lui dis que la suivante est celle qu'on vien de créer */
celHaut[j]->suivanteBas = cel;
}else/* on n'a encore rien ajouter dans la case de produit, donc on le fait :) */
mul->colonne[j] = cel;
/* puis, on met la cellule adns le tableau afin de lui affecter plus tard la suivante si il y en aura une */
celHaut[j] = cel;
if(celPrec)/* pareil qu'avant mais on teste sur la ligne */
celPrec->suivanteDroite = cel;
else
mul->ligne[i] = cel;
celPrec = cel;
}
}
}
free(nbZeroHaut);
free(celHaut);
return mul;
} |
Partager