Annotation of OpenXM/src/kan96xx/Kan/matrix.c, Revision 1.1
1.1 ! maekawa 1: /* matrix.c */
! 2: #include <stdio.h>
! 3: #include "datatype.h"
! 4: #include "stackm.h"
! 5: #include "extern.h"
! 6: #include "extern2.h"
! 7:
! 8: #include "matrix.h" /* ind() and ind2() are defined. */
! 9: /* You must use n and n2. */
! 10:
! 11: struct arrayOfPOLY *aaAdd(aa,bb)
! 12: struct arrayOfPOLY *aa,*bb;
! 13: /* this function has not been tested yet. */
! 14: {
! 15: int i;
! 16: POLY *r;
! 17: POLY *a;
! 18: POLY *b;
! 19: int size;
! 20: struct arrayOfPOLY *ra;
! 21: size = aa->n;
! 22: a = aa->array; b = bb->array;
! 23: r = (POLY *)sGC_malloc(sizeof(POLY)*size);
! 24: if (r == (POLY *)NULL) errorMatrix("aaAdd(): no more memory");
! 25: for (i=0; i<size; i++) {
! 26: r[i] = ppAdd(a[i],b[i]);
! 27: }
! 28: ra = (struct arrayOfPOLY *)sGC_malloc(sizeof(struct arrayOfPOLY));
! 29: if (ra == (struct arrayOfPOLY *)NULL) errorMatrix("No more memory.");
! 30: ra->n = size; ra->array = r;
! 31: return(ra);
! 32: }
! 33:
! 34: struct matrixOfPOLY *aaMult(aa,bb)
! 35: struct matrixOfPOLY *aa,*bb;
! 36: {
! 37: POLY *a;
! 38: POLY *b;
! 39: int m,n,m2,n2; /* c.f. matrix.h */
! 40: /* (m,n) * (m2,n2) */
! 41: int i,j,k;
! 42: POLY *r;
! 43: POLY tmp;
! 44: struct matrixOfPOLY *rmat;
! 45:
! 46: m = aa->m; n = aa->n;
! 47: m2 = bb->m; n2 = bb->n;
! 48: a = aa->mat; b = bb->mat;
! 49: r = (POLY *)sGC_malloc(sizeof(POLY)*m*n2);
! 50: if (r == (POLY *)NULL) errorMatrix("aaMult(): no more memory");
! 51: /* we do not check n == m2. */
! 52: for (i=0; i<m; i++) {
! 53: for (j=0; j<n2; j++) {
! 54: tmp = ZERO;
! 55: for (k=0; k<n; k++) {
! 56: tmp = ppAddv(tmp, ppMult( a[ind(i,k)], b[ind2(k,j)]));
! 57: }
! 58: r[ind2(i,j)] = tmp;
! 59: }
! 60: }
! 61: rmat = (struct matrixOfPOLY *)sGC_malloc(sizeof(struct matrixOfPOLY));
! 62: if (rmat == (struct matrixOfPOLY *)NULL) errorMatrix("No more memory.");
! 63: rmat->m = m; rmat->n = n2;
! 64: rmat->mat = r;
! 65: return(rmat);
! 66: }
! 67:
! 68:
! 69: /**************** error handler ************************/
! 70: void errorMatrix(str)
! 71: char *str;
! 72: {
! 73: fprintf(stderr,"matrix.c: %s\n",str);
! 74: exit(10);
! 75: }
! 76:
! 77: /********************************************************/
! 78:
! 79: struct arrayOfPOLY *newArrayOfPOLY(size)
! 80: int size;
! 81: /* if size<=0, it returns [0,null]. */
! 82: {
! 83: struct arrayOfPOLY *ap;
! 84: ap = (struct arrayOfPOLY *)sGC_malloc(sizeof(struct arrayOfPOLY));
! 85: if (ap == (struct arrayOfPOLY *)NULL) errorMatrix("No more memory.");
! 86: if (size <=0) {
! 87: ap->n = 0; ap->array = (POLY *)NULL;
! 88: return(ap);
! 89: }
! 90: ap->n = size;
! 91: ap->array = (POLY *)sGC_malloc(size*sizeof(POLY));
! 92: if (ap->array == (POLY *)NULL) errorMatrix("No more memory.");
! 93: return(ap);
! 94: }
! 95:
! 96: struct matrixOfPOLY *newMatrixOfPOLY(m,n)
! 97: int m,n;
! 98: /* if size<=0, it returns [0,null]. */
! 99: {
! 100: struct matrixOfPOLY *ap;
! 101: ap = (struct matrixOfPOLY *)sGC_malloc(sizeof(struct matrixOfPOLY));
! 102: if (ap == (struct matrixOfPOLY *)NULL) errorMatrix("No more memory.");
! 103: if ((m <=0) || (n <= 0)) {
! 104: ap->m = ap->n = 0; ap->mat = (POLY *)NULL;
! 105: return(ap);
! 106: }
! 107: ap->m = m; ap->n = n;
! 108: ap->mat = (POLY *)sGC_malloc(m*n*sizeof(POLY));
! 109: if (ap->mat == (POLY *)NULL) errorMatrix("No more memory.");
! 110: return(ap);
! 111: }
! 112:
! 113:
! 114: struct arrayOfPOLY *carrayToArrayOfPOLY(a,size)
! 115: POLY a[];
! 116: int size;
! 117: /* a[] is read only. */
! 118: {
! 119: struct arrayOfPOLY *ans;
! 120: int i;
! 121: ans = newArrayOfPOLY(size);
! 122: for (i=0; i<size; i++) {
! 123: ans->array[i] = a[i];
! 124: }
! 125: return(ans);
! 126: }
! 127:
! 128:
! 129:
! 130:
! 131:
! 132:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>