Anda di halaman 1dari 6

Assignment No.

1
Strassens Matrix Multiplication
#include<stdio.h>
#include <stdlib.h>
intmypow(int n);
int **creatematrix(int m);
voidreadmatrix(int **a,intn,int m);
voidprintmatrix(int **a,int n);
voidaddmatrix(int **a,int **b,int **c,int m);
voidsubmatrix(int **a,int **b,int **c,int m);
int **mult(int **a,int **b,int m);
int main()
{
intn,m;
int **a,**b,**c;
printf("enter size of the matrix :\n");
scanf("%d",&n);
m=mypow(n);
//printf("%d",m);
printf("enter first matrix A :\n");
a=creatematrix(m);
readmatrix(a,n,m);
printmatrix(a,m);
printf("enter second matrix B : \n");
b=creatematrix(m);
readmatrix(b,n,m);
printmatrix(b,m);
printf("\n multiplication is :\n");
c=mult(a,b,m);
printmatrix(c,n);
}
intmypow(int n)
{
intp,h;
int flag=0,rem;
int i=1,x;
h=n;
while(h>2)
{
rem=h%2;
if(rem==1)
{
flag=1;
break;
}
else
h=h/2;
}
if(flag==1)
{
while(n>(4*i))
{
i++;
}
//printf("value of i %d",i);
p=4*i;
//printf(" %d ",p);

}
else
p=n;
return p;
}
int **creatematrix(int m)
{
int **a;
int i;
a=(int**)malloc(m*sizeof(int*));
for (i=0;i<m;i++)
{
a[i] = (int*)malloc(m*sizeof(int));
}
return a;
}
voidreadmatrix(int **a,intn,int m)
{
inti,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=n;i<m;i++)
{
for(j=n;j<m;j++)
{
a[i][j]=0;
}
}
}
voidprintmatrix(int **a,int n)
{
inti,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf(" %d ",a[i][j]);
}
printf("\n");
}
}
voidaddmatrix(int **a,int **b,int **c,int m)
{
inti,j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
c[i][j]=a[i][j]+b[i][j];
}
}
}
voidsubmatrix(int **a,int **b,int **c,int m)

{
inti,j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
c[i][j]=a[i][j]-b[i][j];
}
}
}
int **mult(int **a,int **b,int m)
{
intk,l,i,j,t;
int **c;
int **a11,**a12,**a22,**a21,**b11,**b12,**b21,**b22;
int **m1,**m2,**m3,**m4,**m5,**m6,**m7;
int **p1,**p2;
c=creatematrix(m);
if(m==1)
{
c[0][0]=a[0][0]*b[0][0];
return c;
}
else
{
t=m/2;
a11=creatematrix(t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
a11[i][j]=a[i][j];
}
}
//printf("a11\n");
//printmatrix(a11,t);
a12=creatematrix(t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
a12[i][j]=a[i][j+t];
}
}
//printf("a12\n");
//printmatrix(a12,t);
a21=creatematrix(t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
a21[i][j]=a[i+t][j];
}
}
//printf("a21\n");
//printmatrix(a21,t);
a22=creatematrix(t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{

a22[i][j]=a[i+t][j+t];
}
}
//printf("a22\n");
//printmatrix(a22,t);
b11=creatematrix(t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
b11[i][j]=b[i][j];
}
}
//printf("b11\n");
//printmatrix(b11,t);
b12=creatematrix(t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
b12[i][j]=b[i][j+t];
}
}
//printf("b12\n");
//printmatrix(b12,t);
b21=creatematrix(t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
b21[i][j]=b[i+t][j];
}
}
//printf("b21\n");
//printmatrix(b21,t);
b22=creatematrix(t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
b22[i][j]=b[i+t][j+t];
}
}
//printf("b22\n");
//printmatrix(b22,t);
p1=creatematrix(t);
p2=creatematrix(t);
//m1=(a11+a22)(b11+b22)
addmatrix(a11,a22,p1,t);
addmatrix(b11,b22,p2,t);
m1=mult(p1,p2,t);
//printmatrix(m1,t);
//m2=(a21+a22)b11
addmatrix(a21,a22,p1,t);
m2=mult(p1,b11,t);
//printmatrix(m2,t);
//m3=a11(b12-b22)
submatrix(b12,b22,p1,t);
m3=mult(a11,p1,t);
//m4=a22(b21-b11)
submatrix(b21,b11,p1,t);
m4=mult(a22,p1,t);
//m5=(a11+a12)b22

addmatrix(a11,a12,p1,t);
m5=mult(p1,b22,t);
//m6=(a21-a11)(b11+b12)
submatrix(a21,a11,p1,t);
addmatrix(b11,b12,p2,t);
m6=mult(p1,p2,t);
//m7=(a12-a22)(b21+b22)
submatrix(a12,a22,p1,t);
addmatrix(b21,b22,p2,t);
m7=mult(p1,p2,t);
//c11=m1+m4-m5+m7
addmatrix(m1,m4,p1,t);
submatrix(p1,m5,p2,t);
addmatrix(p2,m7,p1,t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
c[i][j]=p1[i][j];
}
}
//c12=m3+m5
addmatrix(m3,m5,p1,t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
c[i][j+t]=p1[i][j];
}
}
//c21=m2+m4
addmatrix(m2,m4,p2,t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
c[i+t][j]=p2[i][j];
}
}
//c22=m1+m3-m2+m6
addmatrix(m1,m3,p1,t);
submatrix(p1,m2,p2,t);
addmatrix(p2,m6,p1,t);
for(i=0;i<t;i++)
{
for(j=0;j<t;j++)
{
c[i+t][j+t]=p1[i][j];
}
}
return c;
}
}
/************************************************************************
citl04-23@citl04-23:~$ gccst.c
citl04-23@citl04-23:~$ ./a.out
enter size of the matrix :
6
no8enter first matrix A :
1 1 1 1 1 1
1 1 1 1 1 1

1
1
1
1

1
1
1
1

1
1
1
1
1 1
1 1
1 1
1 1
1 1
1 1
0 0
0 0
enter
2 2 2
2 2 2
2 2 2
2 2 2
2 2 2
2 2 2
2 2
2 2
2 2
2 2
2 2
2 2
0 0
0 0

1
1
1
1

1
1
1
1

1
1
1
1
1 1
1 1
1 1
1 1
1 1
1 1
0 0
0 0
second
2 2 2
2 2 2
2 2 2
2 2 2
2 2 2
2 2 2
2 2
2 2
2 2
2 2
2 2
2 2
0 0
0 0

1 1 0
1 1 0
1 1 0
1 1 0
1 1 0
1 1 0
0 0 0
0 0 0
matrix B

0
0
0
0
0
0
0
0
:

2
2
2
2
2
2
0
0

0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0

multiplication is :
12 12 12 12 12
12 12 12 12 12
12 12 12 12 12
12 12 12 12 12
12 12 12 12 12
12 12 12 12 12

12
12
12
12
12
12

*/

2
2
2
2
2
2
0
0

Anda mungkin juga menyukai