から入手できます。
/* * matrix.c */ #include "matrix.h" matrix new_matrix(nrow, ncol) int nrow, ncol; { int i; vector ap; matrix a; if ((a = (matrix)malloc(nrow * sizeof(vector))) == NULL) return NULL; if ((ap = (vector)malloc(nrow * ncol * sizeof(scalar))) == NULL) { free(a); return NULL; } for (i = 0; i < nrow; i++) a[i] = ap + (i * ncol); return a; } void free_matrix(a) matrix a; { free(a[0]); free(a); } |
/* * vector.c */ #include "matrix.h" vector new_vector(n) int n; { return (vector)malloc(sizeof(scalar) * n); } void free_vector(v) vector v; { free(v); } |
/* * dotprod.c */ #include "matrix.h" double dotprod(n, u, v) int n; vector u, v; { int i, n4; double s; s = 0; n4 = n & 3; /* n % 4 */ for (i = 0; i < n4; i++) s += u[i] * v[i]; for (i = n4; i < n; i += 4) s += u[i] * v[i] + u[i + 1] * v[i + 1] + u[i + 2] * v[i + 2] + u[i + 3] * v[i + 3]; return s; } |
/* * matrix.h */ #ifndef MATUTIL #define MATUTIL #include <stdio.h> #include <stdlib.h> #ifndef scalar #define scalar double #endif typedef int *ivector; typedef float *fvector; typedef double *dvector; typedef scalar *vector; typedef ivector *imatrix; typedef fvector *fmatrix; typedef dvector *dmatrix; typedef vector *matrix; ivector new_ivector(); void free_ivector(); fvector new_fvector(); void free_fvector(); dvector new_dvector(); void free_dvector(); vector new_vector(); void free_vector(); imatrix new_imatrix(); void free_imatrix(); fmatrix new_fmatrix(); void free_fmatrix(); dmatrix new_dmatrix(); void free_dmatrix(); matrix new_matrix(); void free_matrix(); double dotprod(); #endif |
# # Makefile for matrix.a # SRCS = matrix.c vector.c dotprod.c OBJS = matrix.o vector.o dotprod.o LIB = matrix.a PROGS = testmat test-glsc+ heat2d-e CC = cc CFLAGS = -O4 LIBDIR = /usr/local/lib INCDIR = /usr/local/include JUNK = Meta default: $(LIB) all: $(LIB) $(PROGS) matrix.o: matrix.c vector.o: vector.c dotprod.o: dotprod.c matrix.a: $(OBJS) ar cr $@ $(OBJS) && ranlib $@ clean: rm -f $(LIB) $(OBJS) $(PROGS) $(JUNK) test: testmat testmat testmat: testmat.c matrix.a $(CC) -o $@ $(CFLAGS) testmat.c matrix.a test-glsc+: test-glsc+.c $(CC) -o $@ $(CFLAGS) test-glsc+.c -lglscd -L/usr/lib/X11 -lX11 -lm heat2d-e: heat2d-e.c $(LIB) $(CC) -o $@ $(CFLAGS) heat2d-e.c $(LIB) -lglscd -L/usr/lib/X11 -lX11 -lm install: matrix.a -mv -f $(LIBDIR)/libmatrix.a $(LIBDIR)/libmatrix.a.$$ -mv -f $(INCDIR)/matrix.h $(INCDIR)/matrix.h.$$ cp -p matrix.a $(LIBDIR)/libmatrix.a ranlib $(LIBDIR)/libmatrix.a cp -p matrix.h $(INCDIR) |