Esempio n. 1
0
MATRIX __mat_creat(int row, int col)
{
    MATRIX mat = NULL;
    int i;
    if((mat = (MATRIX)malloc(sizeof(mtype *)*(row+2)))==NULL)
        return (mat_error( MAT_MALLOC ));
    for(i=2; i<row+2; ++i)
    {
        if((*((mtype **)(mat + i)) = (mtype *)malloc(sizeof(mtype)*col))==NULL)
            return (mat_error(MAT_MALLOC));
    }
    *((int*)(mat)) = row;
    *((int*)(mat+1)) = col;
    return (mat+2);
}
Esempio n. 2
0
MATRIX mat_randn(int n, int m, MATRIX result)
{
    int i, j;
    mtype tmp0;
    if(result==NULL) if((result = mat_creat(n, m, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    if(!MAT_SET_SEED)mat_set_seed(0);

    for(i=0; i<n; ++i)
    {
        for(j=0; j<m; ++j)
        {
            result[i][j] = (mtype)((mtype)rand()/((mtype)RAND_MAX+1.0f)+EPS);
        }
    }
    if(MatNumel(result)>0) srand((unsigned int)(result[0][0]*7923+1));
    for(i=0; i<n; ++i)
    {
        for(j=0; j<m; ++j)
        {
            tmp0 =((mtype)rand())/((mtype)RAND_MAX+1.0f);
            if(result[i][j]!=0) result[i][j] = (mtype)(sqrt(-2.0f*log(result[i][j]))*cos(2.0f*3.141592f*tmp0));
        }
    }
    return result;
}
Esempio n. 3
0
MATRIX mat_xcopy(MATRIX A, int si, int ei, int sj, int ej, MATRIX result)
{
    int i, j, m, n;
    m = MatCol(A);
    n = MatRow(A);
    if(si<0 || sj<0 || ei>n || ei>m) mat_error(MAT_SIZEMISMATCH);
    if(result== NULL) if((result = mat_creat(ei-si, ej-sj, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    #pragma omp parallel for private(j)
    for(i=si; i<ei; ++i)
        for(j=sj; j<ej; ++j)
        {
            result[i-si][j-sj] = A[i][j];
        }
    return result;
}
Esempio n. 4
0
MATRIX mat_xjoin(MATRIX A11, MATRIX A12, MATRIX A21, MATRIX A22, MATRIX result)
{
    int i, j, m, n;
    m = MatCol(A11)+MatCol(A12);
    n = MatRow(A11)+MatRow(A21);
    if(result== NULL) if((result = mat_creat(m, n, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    #pragma omp parallel for private(j)
    for(i=0; i<MatRow(A11); ++i)
        for(j=0; j<MatCol(A11); ++j)
        {
            result[i][j] = A11[i][j];
        }
    #pragma omp parallel for private(j)
    for(i=0; i<MatRow(A12); ++i)
        for(j=0; j<MatCol(A12); ++j)
        {
            result[i][j+MatCol(A11)] = A12[i][j];
        }
    #pragma omp parallel for private(j)
    for(i=0; i<MatRow(A21); ++i)
        for(j=0; j<MatCol(A21); ++j)
        {
            result[i+MatRow(A21)][j] = A21[i][j];
        }
    #pragma omp parallel for private(j)
    for(i=0; i<MatRow(A22); ++i)
        for(j=0; j<MatCol(A22); ++j)
        {
            result[i+MatRow(A11)][j+MatCol(A22)] = A22[i][j];
        }
    return result;

}
Esempio n. 5
0
MATSTACK mat_eig_sym(MATRIX symmat, MATSTACK result)
{
    int m, n;
    MATRIX im, tmp_result0 = NULL, tmp_result1 = NULL;
    INT_VECTOR indcs = NULL;
    MATSTACK tmp = NULL;
    m = MatCol(symmat);
    n = MatRow(symmat);
    if(m!=n) mat_error(MAT_SIZEMISMATCH);
    if(result==NULL)
    {
        if ((result = matstack_creat(2)) == NULL)
            return matstack_error(MATSTACK_MALLOC);
        result[0] = NULL;
        result[1] = NULL;
    }
    im = mat_creat(m, 1, UNDEFINED);
    tmp_result0 = mat_creat(m, 1, UNDEFINED);
    tmp_result1 = mat_copy(symmat, tmp_result1);
    mat_tred2(tmp_result1, tmp_result0, im);
    mat_tqli(tmp_result0, im, tmp_result1);

    tmp = mat_qsort(tmp_result0, ROWS, tmp);
    result[0] = mat_copy(tmp[0], result[0]);
    indcs = mat_2int_vec(tmp[1]);
    result[1] = mat_get_sub_matrix_from_cols(tmp_result1, indcs, result[1]);
    int_vec_free(indcs);
    mat_free(im);
    mat_free(tmp_result0);
    mat_free(tmp_result1);

    return result;
}
/*
    Function which make the transposition operation of a
    matrix passed as a parameter.
    It returns a double pointer which points to the current location
    in which the new trasposed matrix will be.
*/
matrice* trasposta( matrice *mt, matrice *m )
{
  int i,j;
  
  if ( !matrixExist(m) )
  {
    set_error(EMNI);
    printf("PROVA");
    mat_error("PROVAAAAA");
  }
  else
	  if ( ( leggiRighe(mt) != leggiColonne(m) && leggiColonne(mt) != leggiRighe(m) ) )
	  {
		  if (  get_curr_error() == EMNOTF )
			  set_error(EMTRASP);
	  }
  else
  {
      
      for ( i=0; i < leggiRighe(mt); i++ )
          for ( j = 0; j < leggiColonne(mt); j++ )
              scriviElemento(mt,i,j,leggiElemento(m,j,i));
  }
  

  return ( get_curr_error() == EMNOTF ) ? mt : NULL;
}
Esempio n. 7
0
MATRIX mat_pick_col(MATRIX A, int c, MATRIX result)
{
    int n, i;
    n = MatRow(A);
    if(result==NULL) if((result = mat_creat(n, 1, UNDEFINED))==NULL) mat_error(MAT_MALLOC);
    for(i=0; i<n; ++i) result[i][0] = A[i][c];
    return result;
}
Esempio n. 8
0
MATRIX mat_pick_row(MATRIX A, int r, MATRIX result)
{
    int m, i;
    m = MatCol(A);
    if(result==NULL) if((result = mat_creat(1, m, UNDEFINED))==NULL) mat_error(MAT_MALLOC);
    for(i=0; i<m; ++i) result[0][i] = A[r][i];
    return result;
}
Esempio n. 9
0
MATRIX mat_concat(MATRIX A, MATRIX B, int dim)
{
    int i, j, m, n, o, p;
    MATRIX result;
    if(A==NULL)
    {
        return mat_copy(B, NULL);
    }
    else
    {
        m = MatCol(A);
        n = MatRow(A);
    }
    if(B==NULL)
    {
        return mat_copy(A, NULL);
    }
    else
    {
        o = MatCol(B);
        p = MatRow(B);
    }
    if((dim==ROWS)&&((m==o) ||!((m==0)&&(o==0))))
    {
        if((result = mat_creat(n+p, m, UNDEFINED))==NULL) return NULL;
        #pragma omp parallel for private(j)
        for(i=0; i<n; ++i)
        {
            for(j=0; j<m; ++j)
            {
                result[i][j] = A[i][j];
            }
        }
        #pragma omp parallel for private(j)
        for(i=0; i<p; ++i)
        {
            for(j=0; j<m; ++j)
            {
                result[i+n][j] = B[i][j];
            }
        }
        return result;
    }
    if((dim==COLS)&&((n==p) ||!((n==0)&&(p==0))))
    {
        if((result = mat_creat(n, m+o, UNDEFINED))==NULL) return NULL;
        #pragma omp parallel for private(j)
        for(i=0; i<n; ++i)
        {
            for(j=0; j<m; ++j) result[i][j] = A[i][j];
            for(j=0; j<o; ++j) result[i][j+m] = B[i][j];
        }
        return result;
    }
    return mat_error(MAT_SIZEMISMATCH);
}
Esempio n. 10
0
MATRIX mat_get_sub_matrix_from_cols(MATRIX A, INT_VECTOR indices, MATRIX result)
{
    int i, j, k, n;
    k = MatRow(A);
    n = Int_VecLen(indices);
    if(result==NULL) if((result = mat_creat(k, n, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    for(i=0; i<n; ++i)
    {
        for(j=0; j<k; ++j) result[j][i] = A[j][indices[i]];
    }
    return result;
}
Esempio n. 11
0
MATRIX mat_sum_col(MATRIX A, MATRIX result)
{
    int i, j, m, n;
    m = MatCol(A);
    n = MatRow(A);
    if(result==NULL) if((result = mat_creat(1, m, ZERO_MATRIX))==NULL) mat_error(MAT_MALLOC);
    #pragma omp parallel for private(j)
    for(i=0; i<m; ++i)
    {
        result[0][i] = 0.0;
        for(j=0; j<n; ++j) result[0][i] += A[j][i];
    }
    return result;
}
Esempio n. 12
0
MATRIX mat_randperm(int m, int n, MATRIX result)
{
    int i, j;
    MATRIX tmp = NULL;
    if(result==NULL) if((result = mat_creat(m, n, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    for(i=0; i<m; ++i)
    {
        tmp = mat_randperm_n(n, tmp);
        for(j=0; j<n; ++j) result[i][j] = tmp[0][j];
    }
    mat_free(tmp);
    return result;
}
Esempio n. 13
0
MATRIX mat_creat_diag(MATRIX diag_vals, MATRIX result)
{
    int i, sz;
    if(MatCol(diag_vals)==1) sz = MatRow(diag_vals);
    else sz = MatCol(diag_vals);
    if(result==NULL) if((result = mat_creat(sz, sz, ZERO_MATRIX))==NULL) mat_error(MAT_MALLOC);
    {
        if(MatCol(diag_vals)==1)
            for(i=0; i<sz; ++i) result[i][i] = diag_vals[i][0];
        else
            for(i=0; i<sz; ++i) result[i][i] = diag_vals[0][i];
        return result;
    }
}
Esempio n. 14
0
MATRIX mat_rand(int n, int m, MATRIX result)
{
    int i, j;
    if(result==NULL) if((result = mat_creat(n, m, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    if(!MAT_SET_SEED)mat_set_seed(0);
    for(i=0; i<n; ++i)
    {
        for(j=0; j<m; ++j)
        {
            result[i][j] = ((mtype)rand())/((mtype)RAND_MAX+1.0);
        }
    }
    return result;
}
Esempio n. 15
0
MATRIX mat_randfun(int n, int m, mtype (*fun)(mtype), mtype xmin, mtype xmax, MATRIX result)
{
    int i, j;
    if(result==NULL) if((result = mat_creat(n, m, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    if(!MAT_SET_SEED)mat_set_seed(0);
    for(i=0; i<n; ++i)
    {
        for(j=0; j<m; ++j)
        {
            result[i][j] = __mat_randfun(fun, xmin, xmax);
        }
    }
    return result;
}
Esempio n. 16
0
MATRIX mat_copy(MATRIX A, MATRIX result)
{
    int i, j, m, n;
    m = MatCol(A);
    n = MatRow(A);
    if(result==NULL) if((result = mat_creat(n, m, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    #pragma omp parallel for private(j)
    for(i=0; i<n; ++i)
        for(j=0; j<m; ++j)
        {
            result[i][j] = A[i][j];
        }
    return result;
}
Esempio n. 17
0
MATRIX mat_tran(MATRIX A, MATRIX result)
{
    int	i, j, m, n;
    m = MatCol(A);
    n = MatRow(A);

    if(result== NULL) if((result = mat_creat(m,n, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    for(i=0; i<m; ++i)
        for (j=0; j<n; ++j)
        {
            result[i][j] = A[j][i];
        }
    return result;
}
Esempio n. 18
0
MATRIX mat_div_dot(MATRIX A, MATRIX B, MATRIX result)
{
    int i, j, m, n, o, p;
    m = MatCol(A);
    n = MatRow(A);
    o = MatCol(B);
    p = MatRow(B);
    if(result==NULL) if((result = mat_creat(MatRow(A), MatCol(A), UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    if(o==m &&p==n)
    {
        #pragma omp parallel for private(j)
        for(i=0; i<n; ++i)
        {
            for(j=0; j<m; ++j)
            {
                result[i][j] = A[i][j]/B[i][j];
            }
        }
    }
    else if(o==1 && p!=1)
    {
        #pragma omp parallel for private(j)
        for(i=0; i<n; ++i)
        {
            for(j=0; j<m; ++j)
            {
                result[i][j] = A[i][j]/B[i][0];
            }
        }
    }
    else if(p==1 && o!=1)
    {
        #pragma omp parallel for private(j)
        for(i=0; i<n; ++i)
        {
            for(j=0; j<m; ++j)
            {
                result[i][j] = A[i][j]/B[0][j];
            }
        }
    }
    else gen_error(GEN_SIZEMISMATCH);
    return result;
}
Esempio n. 19
0
MATRIX mat_calc_dist_sq(MATRIX A, MATRIX d, MATRIX result)
{
    int i, j, m, n;
    mtype dist;
    m = MatRow(A);
    n = MatCol(A);
    if(result==NULL) if((result = mat_creat(1, n, ZERO_MATRIX))==NULL) return mat_error(MAT_MALLOC);;
    for(i=0; i<n; ++i)
    {
        dist = 0.0;
        for(j=0; j<m; ++j)
        {
            dist += (A[j][i]-d[j][0])*(A[j][i]-d[j][0]);
        }
        result[0][i] = dist;
    }
    return result;
}
Esempio n. 20
0
MATRIX mat_randperm_n(int n, MATRIX result)
{
    int i, j;
    mtype t = 0.0;
    if(result==NULL) if((result = mat_creat(1, n, UNDEFINED))==NULL)
            return mat_error(MAT_MALLOC);
    if(!MAT_SET_SEED) mat_set_seed(0);
    for(i=0; i<n; ++i)
        result[0][i] = i;
    for(i=0; i<n; ++i)
    {
        j = rand()%(n-i)+i;
        t = result[0][j];
        result[0][j] =result[0][i];
        result[0][i] = t;
    }
    return result;
}
Esempio n. 21
0
MATRIX mat_pol2cart(MATRIX A, int dim, MATRIX result)
{
    int m, n, i;
    m = MatCol(A);
    n = MatRow(A);
    if(dim==0 && n>1)
    {
        if(result==NULL)if((result = mat_creat(2, m, ZERO_MATRIX))==NULL) return NULL;
        for(i=0; i<m; ++i)
            __pol2cart(A[0][i], A[1][i], result[0][i], result[1][i]);
        return result;
    }
    if(dim==1 && m>1)
    {
        if(result==NULL)if((result = mat_creat(n, 2, ZERO_MATRIX))==NULL) return NULL;
        for(i=0; i<n; ++i)
            __pol2cart(A[i][0], A[i][1], result[i][0], result[i][1]);
        return result;
    }
    return mat_error (MAT_SIZEMISMATCH);
}
Esempio n. 22
0
MATRIX mat_bsxfun(MATRIX A, MATRIX B, mtype (*func)(mtype, mtype), MATRIX result)
{
    int m, n, o, p, i, j;
    m = MatRow(A);
    n = MatCol(A);

    o = MatRow(B);
    p = MatCol(B);
    if(m<o && n==p && m==1)
    {
        if(result== NULL) if((result = mat_creat(o, n, UNDEFINED))==NULL) return mat_error(MAT_MALLOC);
        for(i=0; i<o; ++i)
        {
            for(j=0; j<n; ++j)
            {
                result[i][j] = (*func)(A[0][j], B[i][j]);
            }
        }
    }
    else if(m>o && n==p && o==1)
    {
        if(result== NULL) if((result = mat_creat(m, n, UNDEFINED))==NULL) return mat_error(MAT_MALLOC);
        for(i=0; i<m; ++i)
        {
            for(j=0; j<n; ++j)
            {
                result[i][j] = (*func)(A[i][j], B[0][j]);
            }
        }
    }
    else if(m==o && n<p && n==1)
    {
        if(result== NULL) if((result = mat_creat(m, p, UNDEFINED))==NULL) return mat_error(MAT_MALLOC);
        for(i=0; i<m; ++i)
        {
            for(j=0; j<p; ++j)
            {
                result[i][j] = (*func)(A[i][0], B[i][j]);
            }
        }
    }
    else if(m==o && n>p && p==1)
    {
        if(result== NULL) if((result = mat_creat(m, n, UNDEFINED))==NULL) return mat_error(MAT_MALLOC);
        for(i=0; i<m; ++i)
        {
            for(j=0; j<n; ++j)
            {
                result[i][j] = (*func)(A[i][j], B[i][0]);
            }
        }
    }
    else if(m==1 && p==1)
    {
        if(result== NULL) if((result = mat_creat(o, n, UNDEFINED))==NULL) return mat_error(MAT_MALLOC);
        for(i=0; i<o; ++i)
        {
            for(j=0; j<n; ++j)
            {
                result[i][j] = (*func)(A[0][j], B[i][0]);
            }
        }
    }
    else if(n==1 && o==1)
    {
        if(result== NULL) if((result = mat_creat(m, p, UNDEFINED))==NULL) return mat_error(MAT_MALLOC);
        for(i=0; i<m; ++i)
        {
            for(j=0; j<p; ++j)
            {
                result[i][j] = (*func)(A[i][0], B[0][j]);
            }
        }
    }
    else mat_error(MAT_SIZEMISMATCH);
    return result;
}