Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
  }
}