[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

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>