#include #include #include #include #include #define RANDOM_SEED time(NULL) void printUsage() { fprintf(stderr, "usage: matrixMult -n -m -p [-h]\n" " Generate random matrices of sizes n*m, m*p and multiply them\n" " \n" " n and m need to be nonzero\n" ); } void generateMatrix(int *matrix, unsigned int height, unsigned int width) { for (int n = 0; n < height; n++) { for (int m = 0; m < width; m++) { matrix[n * width + m] = rand() % 100; } } } void matrixMultiply(int *m1, int *m2, int *res, unsigned int n, unsigned int m, unsigned int p) { for (int i = 0; i < n; i++) { for (int j = 0; j < p; j++) { res[i * p + j] = 0; for (int r = 0; r < m; r++) res[i * p + j] += m1[i * m + r] * m2[r * p + j]; } } } void main(int argc, char* argv[]) { int c; unsigned int n = 0; unsigned int m = 0; unsigned int p = 0; int *m1; int *m2; int *r; while((c = getopt(argc, argv, "n:m:p:")) != -1) { switch (c) { case 'n': sscanf(optarg, "%u", &n); break; case 'm': sscanf(optarg, "%u", &m); break; case 'p': sscanf(optarg, "%u", &p); break; case 'h': printUsage(); exit(0); break; default: printUsage(); exit(2); } } if (n == 0) fprintf(stderr, "n is zero\n"); if (m == 0) fprintf(stderr, "m is zero\n"); if (p == 0) fprintf(stderr, "p is zero\n"); if (n == 0 || m == 0 || p == 0) { printUsage(); exit(2); } m1 = malloc(sizeof(int) * n * m); m2 = malloc(sizeof(int) * m * p); r = malloc(sizeof(int) * n * p); srand(RANDOM_SEED); generateMatrix(m1, n, m); generateMatrix(m2, m, p); matrixMultiply(m1, m2, r, n, m, p); for (int h = 0; h < (n > m ? n : m); h++) { if (h < n) { printf("("); for (int w = 0; w < m; w++) { printf(" %5d", m1[h * n + w]); } printf(" )"); } else { printf(" "); for (int w = 0; w < m; w++) printf(" %5s", ""); } if (h == 0) printf(" * "); else printf(" "); if (h < m) { printf("("); for (int w = 0; w < p; w++) { printf(" %5d", m2[h * p + w]); } printf(" )"); } else { printf(" "); for (int w = 0; w < p; w++) printf(" %5s", ""); } if (h == 0) printf(" = "); else printf(" "); if (h < n) { printf("("); for (int w = 0; w < p; w++) { printf(" %5d", r[h * p + w]); } printf(" )"); } else { printf(" "); for (int w = 0; w < p; w++) printf(" %5s", ""); } printf("\n"); } free(m1); free(m2); free(r); }