Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ESCUELA SUPERIOR
DE
CMPUTO
UNIDAD DE APRENDIZAJE:
ANALISIS DE ALGORITMOS
PROFESORA:
GARCIA MENDOZA CONSUELO VARINIA
ALUMNOS:
BENITEZ CRUZ DANIELA
OLIVARES REYES CARLOS ALBERTO
SAAVEDRA PALESTINA ROBERTO
PRACTICA 3:
Multiplicacin de Matrices
GRUPO:
3CM4
Introduccin
Producto de matrices
Dadas dos matrices A y B, su producto es otra matriz P cuyos elementos se
obtienen multiplicando las filas de A por las columnas de B. De Es evidente que el
nmero de columnas de A debe coincidir con el nmero de filas de B. Si A tiene
dimensin m x n y B dimensin n x p, la matriz P ser de orden m x p:
Podemos poner
Objetivos
Realizar un programa para dar solucin al problema de la multiplicacin de
matrices, mediante el mtodo divide y vencers, y por medio de Strassen.
Programa
MULTIPLICACION DE MATRICES CON DIVIDE Y VENCERAS.
CODIGO:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int max(int,int);
int **multiplicamatriz(int **,int **,int); // Funci?n recursiva que multiplica matrices
int **suma(int **,int **,int); // suma de matrices
int **resta(int **,int **,int);// Resta de matrices
void libera(int **,int); // Libera memoria
for(a=0;a<num/2;a++)
{
B[q][w][a]=(int *)malloc(sizeof(int)*(num/2));
for(r=0;r<num/2;r++){
B[q][w][a][r]=mapa2[a+(num/2)*q][r+(num/2)*w];
}
}
}
}
// Hallar las matrices M.
f1=resta(B[0][1],B[1][1],num/2);
f2=suma(A[0][0],A[0][1],num/2);
f3=suma(A[1][0],A[1][1],num/2);
f4=resta(B[1][0],B[0][0],num/2);
f5=suma(A[0][0],A[1][1], num/2);
f6=suma(B[0][0],B[1][1],num/2);
f7=resta(A[0][1],A[1][1],num/2);
f8=suma(B[1][0],B[1][1],num/2);
f9=resta(A[0][0],A[1][0],num/2);
f10=suma(B[0][0],B[0][1],num/2);
M[1]=multiplicamatriz(A[0][0],f1,num/2);
M[2]=multiplicamatriz(f2,B[1][1],num/2);
M[3]=multiplicamatriz(f3,B[0][0],num/2);
M[4]=multiplicamatriz(A[1][1],f4,num/2);
M[5]=multiplicamatriz(f5,f6,num/2);
M[6]=multiplicamatriz(f7,f8,num/2);
M[7]=multiplicamatriz(f9,f10,num/2);
C[0][0]=suma(M[5],M[4],num/2);
aux=C[0][0];
C[0][0]=resta(C[0][0],M[2],num/2);
aux2=C[0][0];
C[0][0]=suma(C[0][0],M[6],num/2);
libera(aux,num/2);
libera(aux2,num/2);
C[0][1]=suma(M[1],M[2],num/2);
C[1][0]=suma(M[3],M[4],num/2);
C[1][1]=suma(M[1],M[5],num/2);
aux=C[1][1];
C[1][1]=resta(C[1][1],M[3],num/2);
aux2=C[1][1];
C[1][1]=resta(C[1][1],M[7],num/2);
libera(aux,num/2);
libera(aux2,num/2);
for(a=1;a<=7;a++){
libera(M[a],num/2);
}
// Unir las submatrices de matrices C en sol.
for(q=0;q<num;q++){
for(w=0;w<num;w++){
sol[q][w]=C[q/(num/2)][w/(num/2)][q%(num/2)][w%(num/2)];
}
}
// Liberar las submatrices de A, B y C.
/*for(q=0;q<2;q++){
for(w=0;w<2;w++)
{
libera(A[q][w],num/2);
libera(B[q][w],num/2);
libera(C[q][w],num/2);
}
}*/
}
return(sol);
}
int **sol,**M[8],**f1,**f2,**aux,**aux2;
int **A[2][2],**B[2][2],**C[2][2];
int a,q,w,r,b;
M[0]=multiplicaDyV(A[0][0],B[0][0],num/2);
M[1]=multiplicaDyV(A[0][1],B[1][0],num/2);
M[2]=multiplicaDyV(A[0][0],B[0][1],num/2);
M[3]=multiplicaDyV(A[0][1],B[1][1],num/2);
M[4]=multiplicaDyV(A[1][0],B[0][0],num/2);
M[5]=multiplicaDyV(A[1][1],B[1][0],num/2);
M[6]=multiplicaDyV(A[1][0],B[0][1],num/2);
M[7]=multiplicaDyV(A[1][1],B[1][1],num/2);
C[0][0]=suma(M[0],M[1],num/2);
C[0][1]=suma(M[2],M[3],num/2);
C[1][0]=suma(M[4],M[5],num/2);
C[1][1]=suma(M[6],M[7],num/2);
for(a=0;a<=7;a++){
libera(M[a],num/2);
}
// Unir las submatrices de matrices C en sol.
for(q=0;q<num;q++){
for(w=0;w<num;w++){
sol[q][w]=C[q/(num/2)][w/(num/2)][q%(num/2)][w%(num/2)];
}
}
// Liberar las submatrices de A, B y C.
/*for(q=0;q<2;q++){
for(w=0;w<2;w++)
{
libera(A[q][w],num/2);
libera(B[q][w],num/2);
libera(C[q][w],num/2);
}
}*/
return(sol);
}
int **sol;
int a,b;
sol=(int **)malloc(sizeof(int *)*num);
for(a=0;a<num;a++)
{
sol[a]=(int *)malloc(sizeof(int)*num);
for(b=0;b<num;b++){
sol[a][b]=mapa1[a][b]-mapa2[a][b];
//printf("resta sol : %d\n", sol[a][b]);
}
}
return(sol);
}
int main()
{
}
puts("Datos primer matriz\n");
printf("%d", mapa1[a][b]);
}printf("\n");
}
mapa2=(int **)malloc(sizeof(int *)*m); // Se crea la sedunda matriz.
for(a=0;a<m;a++)
{
mapa2[a]=(int *)malloc(sizeof(int)*m);
memset(mapa2[a],0,sizeof(int)*m);
}
puts("Datos segunda matriz\n");
//printf("valor %d , %d = %d\n",b,a,mapa2[b][a]);
}
}
for(a=0;a<m;a++){
for(b=0;b<m;b++){
printf("%d", mapa2[a][b]);
}printf("\n");
}
sol=multiplicaDyV(mapa1,mapa2,m); // Se multiplican.
sol1=multiplicamatriz(mapa1,mapa2,m);
Conclusiones
Con esta prctica observamos que el problema de multiplicacin de matrices se
puede resolver de diferentes formas, por medio de divide y vencers y el mtodo de
Strassen, con esto aprendimos que para este problema en particular la tcnica
divide y vencers es ms lenta, aunque no quedo muy claro ya que las matrices
que utilizamos no fueron lo suficientemente grandes como para observar
completamente esta diferencia.
Referencias
http://es.wikipedia.org/wiki/Algoritmo_de_Strassen
http://www.ing.ula.ve/~aguilar/actividad-docente/AYDA/Clase7MiniSem.pdf