[BACK]Return to matrices.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / TiGERS_0.9

Annotation of OpenXM_contrib/TiGERS_0.9/matrices.c, Revision 1.1

1.1     ! maekawa     1: /*
        !             2: **  matrices.c                                 4/99
        !             3: **
        !             4: **  Definition and Minipulation of integer and double matrices and vectors.
        !             5: **  vectors are simply C-vectors (with indices starting at zero) and matrices
        !             6: **  are stored Numerical Recepies style -- as a vector of pointers to the
        !             7: **  rows of the matrix [which are themselves just regular C vectors].
        !             8: **
        !             9: ** TiGERS,  Toric Groebner Basis Enumeration by Reverse Search
        !            10: ** copyright (c) 1999  Birk Huber
        !            11: **
        !            12: */
        !            13: #include<stdio.h>
        !            14: #include<stdlib.h>
        !            15: #include "utils.h"
        !            16: #include "matrices.h"
        !            17:
        !            18: /*
        !            19: ** Integer Matrices:
        !            20: **   new_imatrix(int r, int c) -- reserve storage for a rxc matrix of integers
        !            21: **   free_imatrix(*M)          -- free storage allocated with new_imatrix()
        !            22: **
        !            23: **   integer matrix is given by the integers r,c and a vector M of rows
        !            24: **
        !            25: **  example  r=4, c=3
        !            26: **           _____________________________
        !            27: **      M=  | row0 | row1 | row 2| row 3 |        pointers to rows
        !            28: **           ---|--------|-------|---- --|
        !            29: **              |        |        \       \
        !            30: **              _____________________________________
        !            31: **             |e0|e1|e2|e3|e4|e5|e6|e7|e8|e9|e10|e11|  vector of elements
        !            32: **              -------------------------------------
        !            33: **
        !            34: */
        !            35: int **new_imatrix(int r, int c){
        !            36:     int **tmp=0;
        !            37:     int i,m=r,n=c;
        !            38:     /* get space for pointers to rows*/
        !            39:     if ((tmp=(int **)malloc(m*sizeof(int *)))==0){
        !            40:       fprintf(stderr,"memory failure 1 in new_imatrix()\n");
        !            41:       abort();
        !            42:     }
        !            43:     /* get space for all entrees -- store in pointer to first row*/
        !            44:     if ((tmp[0]=(int *)malloc(n*m*sizeof(int)))==0){
        !            45:         fprintf(stderr,"memory failure 2 in new_imatrix()\n");
        !            46:         free((void *)tmp);
        !            47:         abort();
        !            48:     }
        !            49:     /* set remaining row pointers into entry space*/
        !            50:     for(i=1;i<m;i++) tmp[i]=tmp[i-1]+n;
        !            51:     return tmp;
        !            52:     }
        !            53:
        !            54:
        !            55: void free_imatrix(int **M){
        !            56:   if (M!=0){
        !            57:     if (M[0]!=0) free((void *)M[0]);
        !            58:     free((void *)M);
        !            59:   }
        !            60: }
        !            61:
        !            62: /*
        !            63: ** Integer Matrices: IO routines
        !            64: **
        !            65: ** imatrix_read(FILE *is, int *m, int *n)
        !            66: **   -- read in description of imatrix from is, create matrix and fill it.
        !            67: **   -- format: { m n : entry_1 .... entry_mn } where m=number of rows
        !            68: **                                                    n=number of columns
        !            69: **  e.g.
        !            70: **     { 2 4 : 1 0 3 5 0 1 8 9 } describes the matrix [ 1, 0, 3, 5]
        !            71: **                                                    [ 0, 1, 8, 9]
        !            72: ** print_imatrix(FILE *of, char *prefix,int **M, int m, int n)
        !            73: **   -- copy prefex string to output file of, then write ascii representation
        !            74: **      of matrix with m-rows, n-cols and entrees in M to of.
        !            75: **
        !            76: */
        !            77: int **imatrix_read(FILE *is,int *m, int *n){
        !            78:   char c;
        !            79:   int i,j;
        !            80:   int **M;
        !            81:
        !            82:   /* find openning brace */
        !            83:   eatwhite(is);
        !            84:   c=getc(is);
        !            85:   if (c!='{'){
        !            86:     fprintf(stderr,"ERROR: expecting '{' in imatrix_read()\n");
        !            87:     return 0;
        !            88:   }
        !            89:   /* read in matrix dimensions and initialize matrix */
        !            90:   fscanf(is," %d %d :",m,n);
        !            91:   M=new_imatrix(*m,*n);
        !            92:
        !            93:   /* read in matrix entrees */
        !            94:   for(i=0;i<*m;i++){
        !            95:     for(j=0;j<*n;j++){
        !            96:       fscanf(is," %d",&(IMref(M,i,j)));
        !            97:     }
        !            98:   }
        !            99:
        !           100:   /* find closing brace */
        !           101:   eatwhite(is);
        !           102:   c=getc(is);
        !           103:   if (c!='}'){
        !           104:     fprintf(stderr,"ERROR: expecting '}' in imatrix_read()\n");
        !           105:     return 0;
        !           106:   }
        !           107:
        !           108: return M;
        !           109: }
        !           110:
        !           111: void print_imatrix(FILE *of, char *prefix,int **M, int m, int n){
        !           112:   int i,j;
        !           113:   fprintf(of,"{ %d %d:\n",m,n);
        !           114:   for(i=0;i<m;i++){
        !           115:    fprintf(of,"%s %d",prefix,IMref(M,i,0));
        !           116:    for(j=1;j<n;j++) fprintf(of,", %d",IMref(M,i,j));
        !           117:    fprintf(of,"\n");
        !           118:   }
        !           119:   fprintf(of,"%s}\n",prefix);
        !           120: }
        !           121:
        !           122: /*
        !           123: ** Integer Vectors:
        !           124: ** new_ivector(int n)    -- reserve storage for a c-vector of n integers
        !           125: ** free_ivector(int *M)  -- free storage allocated by new_ivector()
        !           126: **
        !           127: */
        !           128: int  *new_ivector(int n){
        !           129:        int *tmp=0;
        !           130:        tmp=(int *)malloc(n*sizeof(int));
        !           131:        if (tmp==0){ fprintf(stderr,"memory failure in new_ivector()\n");
        !           132:                   abort();
        !           133:        }
        !           134:        return tmp;
        !           135: }
        !           136:
        !           137: void free_ivector(int *M){ if (M!=0)free((void *)M);}
        !           138:
        !           139:
        !           140: /*
        !           141: ** Double Matrices
        !           142: **   new_matrix(int r, int c) -- reserve storage for a rxc matrix of doubles
        !           143: **   free_matrix(*M)          -- free storage allocated with new_matrix()
        !           144: **
        !           145: **   (aside from the data types of the entries -- double matrices are exactly
        !           146: **    as described above for integer matrices)
        !           147: **
        !           148: */
        !           149: double **new_matrix(int r, int c){
        !           150:     double **tmp=0;
        !           151:     int i,m=c,n=r;
        !           152:     if ((tmp=(double **)malloc(m*sizeof(double *)))==0){
        !           153:       fprintf(stderr,"memory failure 1 in new_matrix()\n");
        !           154:       abort();
        !           155:     }
        !           156:     if ((tmp[0]=(double *)malloc(n*m*sizeof(double)))==0){
        !           157:       fprintf(stderr,"memory failure 2 in new_matrix()\n");
        !           158:       free((void *)tmp);
        !           159:       abort();
        !           160:     }
        !           161:     for(i=1;i<m;i++) tmp[i]=tmp[i-1]+n;
        !           162:     return tmp;
        !           163: }
        !           164:
        !           165: void free_matrix(double **M){
        !           166:     if (M!=0){
        !           167:       if (M[0]!=0) free((void *)M[0]);
        !           168:       free((void *)M);
        !           169:     }
        !           170: }
        !           171:
        !           172: /*
        !           173: ** Double Vectors:
        !           174: ** new_vector(int n)    -- reserve storage for a c-vector of n doubles
        !           175: ** free_vector(int *M)  -- free storage allocated by new_vector()
        !           176: **
        !           177: */
        !           178: double *new_vector(int n){
        !           179:        double *tmp=0;
        !           180:        tmp=(double *)malloc(n*sizeof(double));
        !           181:        if (tmp==0){ fprintf(stderr,"memory failure in new_vector\n");
        !           182:                   abort();
        !           183:        }
        !           184:        return tmp;
        !           185: }
        !           186:
        !           187: void free_vector(double *M){ if (M!=0)free((void *)M);}
        !           188:
        !           189:
        !           190:
        !           191:
        !           192:
        !           193:
        !           194:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>