void solveSystems(double **a, double *bx) { int index[255], i, count = 0, bad_line; double **atmp; int n = 8; atmp = new double *[n]; for (i = 0; i < n; i++) { atmp[i] = new double[n]; memcpy(atmp[i], a[i], n * sizeof(double)); } while ((bad_line = splitMatrix(atmp, n, index)) != 0 && n > 0) { /*printf("la riga %d fa schifo!\n", bad_line);*/ /*bad_lines[count] = bad_line;*/ for (i = bad_line - 1; i < n - 1; i++) memcpy(atmp[i], a[i + 1], n * sizeof(a[i + 1])); n--; count++; } if (count == 0) computeSolutions(atmp, index, bx); for (i = 0; i < n; i++) delete atmp[i]; delete atmp; }
void strassenMultMatrix(double **a,double **b,double **c,int size){ //Performs a Strassen matrix multiply operation //This does miracles, and is recursive //To perform a miracle, it first performs a miracle double **a11, **a22, **a12, **a21; double **b11, **b22, **b12, **b21; double **m1, **m2, **m3, **m4, **m5, **m6, **m7; double **t1, **t2, **t3, **t4, **t5, **t6, **t7, **t8, **t9, **t10; int newsize = (int)size/2; int i; if (size > threshold) { //Allocate memory....this could get expensive pretty quickly a11 = (double**) malloc(sizeof(double)*newsize); a12 = (double**) malloc(sizeof(double)*newsize); a21 = (double**) malloc(sizeof(double)*newsize); a22 = (double**) malloc(sizeof(double)*newsize); b11 = (double**) malloc(sizeof(double)*newsize); b12 = (double**) malloc(sizeof(double)*newsize); b21 = (double**) malloc(sizeof(double)*newsize); b22 = (double**) malloc(sizeof(double)*newsize); m1 = (double**) malloc(sizeof(double)*newsize); m2 = (double**) malloc(sizeof(double)*newsize); m3 = (double**) malloc(sizeof(double)*newsize); m4 = (double**) malloc(sizeof(double)*newsize); m5 = (double**) malloc(sizeof(double)*newsize); m6 = (double**) malloc(sizeof(double)*newsize); m7 = (double**) malloc(sizeof(double)*newsize); t1 = (double**) malloc(sizeof(double)*newsize); t2 = (double**) malloc(sizeof(double)*newsize); t3 = (double**) malloc(sizeof(double)*newsize); t4 = (double**) malloc(sizeof(double)*newsize); t5 = (double**) malloc(sizeof(double)*newsize); t6 = (double**) malloc(sizeof(double)*newsize); t7 = (double**) malloc(sizeof(double)*newsize); t8 = (double**) malloc(sizeof(double)*newsize); t9 = (double**) malloc(sizeof(double)*newsize); t10 = (double**) malloc(sizeof(double)*newsize); for (i=0; i < newsize; i++){ a11[i] = (double*) malloc(sizeof(double)*newsize); a12[i] = (double*) malloc(sizeof(double)*newsize); a21[i] = (double*) malloc(sizeof(double)*newsize); a22[i] = (double*) malloc(sizeof(double)*newsize); b11[i] = (double*) malloc(sizeof(double)*newsize); b12[i] = (double*) malloc(sizeof(double)*newsize); b21[i] = (double*) malloc(sizeof(double)*newsize); b22[i] = (double*) malloc(sizeof(double)*newsize); m1[i] = (double*) malloc(sizeof(double)*newsize); m2[i] = (double*) malloc(sizeof(double)*newsize); m3[i] = (double*) malloc(sizeof(double)*newsize); m4[i] = (double*) malloc(sizeof(double)*newsize); m5[i] = (double*) malloc(sizeof(double)*newsize); m6[i] = (double*) malloc(sizeof(double)*newsize); m7[i] = (double*) malloc(sizeof(double)*newsize); t1[i] = (double*) malloc(sizeof(double)*newsize); t2[i] = (double*) malloc(sizeof(double)*newsize); t3[i] = (double*) malloc(sizeof(double)*newsize); t4[i] = (double*) malloc(sizeof(double)*newsize); t5[i] = (double*) malloc(sizeof(double)*newsize); t6[i] = (double*) malloc(sizeof(double)*newsize); t7[i] = (double*) malloc(sizeof(double)*newsize); t8[i] = (double*) malloc(sizeof(double)*newsize); t9[i] = (double*) malloc(sizeof(double)*newsize); t10[i] = (double*) malloc(sizeof(double)*newsize); } splitMatrix(a,a11,a12,a21,a22,size); splitMatrix(b,b11,b12,b21,b22,size); addMatrices(a11,a22,t1,newsize); addMatrices(a21,a22,t2,newsize); addMatrices(a11,a12,t3,newsize); subMatrices(a21,a11,t4,newsize); subMatrices(a12,a22,t5,newsize); addMatrices(b11,b22,t6,newsize); subMatrices(b12,b22,t7,newsize); subMatrices(b21,b11,t8,newsize); addMatrices(b11,b12,t9,newsize); addMatrices(b21,b22,t10,newsize); strassenMultMatrix(t1,t6,m1,newsize); strassenMultMatrix(t2,b11,m2,newsize); strassenMultMatrix(a11,t7,m3,newsize); strassenMultMatrix(a22,t8,m4,newsize); strassenMultMatrix(t3,b22,m5,newsize); strassenMultMatrix(t4,t9,m6,newsize); strassenMultMatrix(t5,t10,m7,newsize); addMatrices(m1,m4,a11,newsize); subMatrices(m5,m7,a12,newsize); addMatrices(m3,m1,a21,newsize); subMatrices(m2,m6,a22,newsize); subMatrices(a11,a12,b11,newsize); addMatrices(m3,m5,b12,newsize); addMatrices(m2,m4,b21,newsize); subMatrices(a21,a22,b22,newsize); catMatrix(c,b11,b12,b21,b22,size); free(a11);free(a12);free(a21);free(a22); free(b11);free(b12);free(b21);free(b22); free(t1);free(t2);free(t3);free(t4);free(t5);free(t6);free(t7);free(t8);free(t9);free(t10); free(m1);free(m2);free(m3);free(m4);free(m5);free(m6);free(m7); } else { normalMultMatrix(b,a,c,size); } }