From 34d6fae5960a16ecddbd1ed4852a56a0784638ad Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Thu, 3 Nov 2016 14:59:18 +0100 Subject: matrixMult --- Makefile | 7 ++- matrixMult.c | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 matrixMult.c diff --git a/Makefile b/Makefile index ae2159d..0bf9d87 100644 --- a/Makefile +++ b/Makefile @@ -5,11 +5,14 @@ PREFIX = /usr/local .PHONY: all install -all: temperaturUmrechner +all: temperaturUmrechner matrixMult install: mkdir -p $(PREFIX)/bin - install -m 0755 -t $(PREFIX)/bin temperaturUmrechner + install -m 0755 -t $(PREFIX)/bin temperaturUmrechner matrixMult temperaterUmrechner: $(CC) $(INCLUDES) $(CCFLAGS) -o temperaturUmrechner temperaturUmrechner.c + +matrixMult: + $(CC) $(INCLUDES) $(CCFLAGS) -o matrixMult matrixMult.c diff --git a/matrixMult.c b/matrixMult.c new file mode 100644 index 0000000..8e19dac --- /dev/null +++ b/matrixMult.c @@ -0,0 +1,163 @@ +#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); +} -- cgit v1.2.3