Example #1
0
/* c = a*b */
void RecMult(int n, matrix a, matrix b, matrix c)
{

    matrix d;

    if (n <= block) {
        double sum, **p = a->d, **q = b->d, **r = c->d;
        int i, j, k;

        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                for (sum = 0., k = 0; k < n; k++)
                    sum += p[i][k] * q[k][j];
                r[i][j] = sum;
            }
        }
    } 
    else {
        d=newmatrix(n);
        n /= 2;
        RecMult(n, a11, b11, d11);
        RecMult(n, a12, b21, c11);
        RecAdd(n, d11, c11, c11);
        RecMult(n, a11, b12, d12);
        RecMult(n, a12, b22, c12);
        RecAdd(n, d12, c12, c12);
        RecMult(n, a21, b11, d21);
        RecMult(n, a22, b21, c21);
        RecAdd(n, d21, c21, c21);
        RecMult(n, a21, b12, d22);
        RecMult(n, a22, b22, c22);
        RecAdd(n, d22, c22, c22);
        freematrix(d,n*2);
    }
}
Example #2
0
/* c = a+b */
void RecAdd(int n, matrix a, matrix b, matrix c) {
    if (n <= block) {
        double **p = a->d, **q = b->d, **r = c->d;
        int i, j;
        for (i = 0; i < n; i++) 
            for (j = 0; j < n; j++) 
                r[i][j] = p[i][j] + q[i][j];
    } 
    else {
        n /= 2;
        RecAdd(n, a11, b11, c11);
        RecAdd(n, a12, b12, c12);
        RecAdd(n, a21, b21, c21);
        RecAdd(n, a22, b22, c22);
    }
}
/*Recursive Strassen Multiplication*/
void StrassenMult(int n, matrix a, matrix b, matrix c) {
	
	matrix t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,q1,q2,q3,q4,q5,q6,q7;

	
    	if (n <= block) {
		double sum, **p = a->d, **q = b->d, **r = c->d;
		int i, j, k;

		for (i = 0; i < n; i++) {
			for (j = 0; j < n; j++) {
				for (sum = 0., k = 0; k < n; k++)
					sum += p[i][k] * q[k][j];
				r[i][j] = sum;
	    		}
		}
    	} 
	else {
		n /= 2;


		t1=newmatrix(n);
		t2=newmatrix(n);
		t3=newmatrix(n);
		t4=newmatrix(n);
		t5=newmatrix(n);
		t6=newmatrix(n);
		t7=newmatrix(n);
		t8=newmatrix(n);
		t9=newmatrix(n);
		t10=newmatrix(n);
		q1=newmatrix(n);
		q2=newmatrix(n);
		q3=newmatrix(n);
		q4=newmatrix(n);
		q5=newmatrix(n);
		q6=newmatrix(n);
		q7=newmatrix(n);

		RecAdd(n,a11,a22,t1);
		RecAdd(n,b11,b22,t2);		
		RecAdd(n,a21,a22,t3);
		RecSub(n,b12,b22,t4);		
		RecSub(n,b21,b11,t5);		
		RecAdd(n,a11,a12,t6);		
		RecSub(n,a21,a11,t7);		
		RecAdd(n,b11,b12,t8);		
		RecSub(n,a12,a22,t9);		
		RecAdd(n,b21,b22,t10);
				
		StrassenMult(n,t1,t2,q1);		
		StrassenMult(n,t3,b11,q2);		
		StrassenMult(n,a11,t4,q3);		
		StrassenMult(n,a22,t5,q4);		
		StrassenMult(n,t6,b22,q5);		
		StrassenMult(n,t7,t8,q6);		
		StrassenMult(n,t9,t10,q7);
		
		RecAdd(n,q1,q4,c11);
		RecSub(n,c11,q5,c11);
		RecAdd(n,q7,c11,c11);
			
		RecAdd(n,q3,q5,c12);
		
		RecAdd(n,q2,q4,c21);
		
		RecAdd(n,q1,q3,c22);
		RecAdd(n,q6,c22,c22);
		RecSub(n,c22,q2,c22);
		
		freematrix(t1,n);
		freematrix(t2,n);
		freematrix(t3,n);
		freematrix(t4,n);
		freematrix(t5,n);
		freematrix(t6,n);
		freematrix(t7,n);
		freematrix(t8,n);
		freematrix(t9,n);
		freematrix(t10,n);
		freematrix(q1,n);
		freematrix(q2,n);
		freematrix(q3,n);
		freematrix(q4,n);
		freematrix(q5,n);
		freematrix(q6,n);
		freematrix(q7,n);

	}
}