------------------mmult.c----------------------------- //A program to multiply matrices #include #include #include #include #include #include "matrix.h" int main(int argc, char * argv[]) { // Three matrices to work with struct matrix *m1=NULL; struct matrix *m2=NULL; struct matrix *m3=NULL; // Create a random 3x3 matrix m1=mrand(3,3); if (m1==NULL) { printf("Malloc error\n"); return 1; } // Create a random 3x3 matrix m2=mrand(3,3); if (m2==NULL) { printf("Malloc error\n"); return 1; } // Multiply the two m3=mmult(m1,m2); if (m3==NULL) { mfree(m1); mfree(m2); return 1; } // Print them all mprint(m1); mprint(m2); mprint(m3); // Clean up mfree(m1); mfree(m2); mfree(m3); return 0; } --------------------matrix.c------------------------ // - Matrix routines #include #include #include #include #include "matrix.h" // Create random matrix of size i by j struct matrix *mrand(int i, int j) { int a, b; // Counters struct matrix *m; // The matrix pointer // Allocate the matrix structure m=(struct matrix *)malloc(sizeof(struct matrix)); if (m==NULL) { perror("Malloc"); return NULL; } // Set the size m->r=i; m->c=j; // Alocate the rows & Handle errors m->d=(float **)malloc(sizeof(float *)*m->r); if (m->d==NULL) { perror("Malloc"); free(m); return NULL; } // Allocate the columns & Handle errors for (b=0; bd[b]=(float *)malloc(sizeof(float)*m->c); if (m->d[b]==NULL) { perror("Malloc"); for (a=0;ad[a]); } free(m->d); free(m); return NULL; } } // Fill the matrix for (a=0;ad[a][b]=drand48(); } } return m; } // Multiply m1 by m2 result is allocated and returned struct matrix *mmult(struct matrix *m1, struct matrix *m2) { struct matrix *m; int a, b, c; // Sanity if (m1==NULL) { printf("Null matrix!\n"); return NULL; } if (m2==NULL) { printf("Null matrix!\n"); return NULL; } // Inner dimensions must agree if (m1->c!=m2->r) { printf("Matrix inner dimensions must agree\n"); return NULL; } // As in mrand(), allocate space for the new matrix m=(struct matrix *)malloc(sizeof(struct matrix)); if (m==NULL) { perror("Malloc"); return NULL; } m->r=m1->r; m->c=m2->c; m->d=(float **)malloc(sizeof(float *)*m->r); if (m->d==NULL) { perror("Malloc"); free(m); return NULL; } for (b=0; br; b++) { m->d[b]=(float *)malloc(sizeof(float)*m->c); if (m->d[b]==NULL) { perror("Malloc"); for (a=0;ad[a]); } free(m->d); free(m); return NULL; } } // Multiply for (a=0;ar;a++) { for (b=0;bc;b++) { m->d[a][b]=0; for (c=0;cc;c++) { m->d[a][b]+=m1->d[a][c]*m2->d[c][b]; } } } return m; } // Print a matrix void mprint(struct matrix *m) { int a, b; // Counters // Sanity if (m==NULL) { printf("Null Matrix!\n"); return; } // MATLAB format printf("["); for (a=0;ar;a++) { for (b=0;bc;b++) { printf("%.9f ",m->d[a][b]); } printf(";\n"); } printf("]\n"); return; } // Free a matrix void mfree(struct matrix *m) { int a; // Counter // Sanity if (m==NULL) { printf("Null Matrix!\n"); return; } // Free in reverse order for (a=0;ar;a++) { free(m->d[a]); } free(m->d); free(m); m=NULL; return; } ------------matrix.h------------- /***Matrix routine protos***/ #ifndef __MATRIX_H__ #define __MATRIX_H__ // Organize the matrix data struct matrix { int r; int c; float **d; }; // Create a random matrix struct matrix * mrand(int i, int j); // Multiply matrices struct matrix * mmult(struct matrix *m1, struct matrix *m2); // Free a matrix void mfree(struct matrix *m); // Print a matrix void mprint(struct matrix *m); #endif // __MATRIX_H__ -------------------Makefile--------------------------------- TARGET=mmult OBJS=mmult.o matrix.o CFLAGS=-g -Wall .PHONY: clean all all: ${TARGET} ${TARGET}: ${OBJS} ${CC} -o ${TARGET} ${OBJS} clean: rm -f ${OBJS} ${TARGET} matrix.o: matrix.h