summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Kleen <kleen@cip.ifi.lmu.de>2016-11-03 14:59:18 +0100
committerGregor Kleen <kleen@cip.ifi.lmu.de>2016-11-03 14:59:18 +0100
commit34d6fae5960a16ecddbd1ed4852a56a0784638ad (patch)
treef7a268b8954a859777b2554d1c89506daac2286e
parent78603c50f61f74624218459ad6d8e212d36e681f (diff)
downloadsysprak.exc-34d6fae5960a16ecddbd1ed4852a56a0784638ad.tar
sysprak.exc-34d6fae5960a16ecddbd1ed4852a56a0784638ad.tar.gz
sysprak.exc-34d6fae5960a16ecddbd1ed4852a56a0784638ad.tar.bz2
sysprak.exc-34d6fae5960a16ecddbd1ed4852a56a0784638ad.tar.xz
sysprak.exc-34d6fae5960a16ecddbd1ed4852a56a0784638ad.zip
matrixMult
-rw-r--r--Makefile7
-rw-r--r--matrixMult.c163
2 files changed, 168 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index ae2159d..0bf9d87 100644
--- a/Makefile
+++ b/Makefile
@@ -5,11 +5,14 @@ PREFIX = /usr/local
5 5
6.PHONY: all install 6.PHONY: all install
7 7
8all: temperaturUmrechner 8all: temperaturUmrechner matrixMult
9 9
10install: 10install:
11 mkdir -p $(PREFIX)/bin 11 mkdir -p $(PREFIX)/bin
12 install -m 0755 -t $(PREFIX)/bin temperaturUmrechner 12 install -m 0755 -t $(PREFIX)/bin temperaturUmrechner matrixMult
13 13
14temperaterUmrechner: 14temperaterUmrechner:
15 $(CC) $(INCLUDES) $(CCFLAGS) -o temperaturUmrechner temperaturUmrechner.c 15 $(CC) $(INCLUDES) $(CCFLAGS) -o temperaturUmrechner temperaturUmrechner.c
16
17matrixMult:
18 $(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 @@
1#include <stdlib.h>
2#include <stdio.h>
3#include <math.h>
4#include <getopt.h>
5#include <time.h>
6
7#define RANDOM_SEED time(NULL)
8
9void printUsage()
10{
11 fprintf(stderr, "usage: matrixMult -n <INT> -m <INT> -p <INT> [-h]\n"
12 " Generate random matrices of sizes n*m, m*p and multiply them\n"
13 " \n"
14 " n and m need to be nonzero\n"
15 );
16}
17
18void generateMatrix(int *matrix, unsigned int height, unsigned int width)
19{
20 for (int n = 0; n < height; n++)
21 {
22 for (int m = 0; m < width; m++)
23 {
24 matrix[n * width + m] = rand() % 100;
25 }
26 }
27}
28
29void matrixMultiply(int *m1, int *m2, int *res, unsigned int n, unsigned int m, unsigned int p)
30{
31 for (int i = 0; i < n; i++)
32 {
33 for (int j = 0; j < p; j++)
34 {
35 res[i * p + j] = 0;
36 for (int r = 0; r < m; r++)
37 res[i * p + j] += m1[i * m + r] * m2[r * p + j];
38 }
39 }
40}
41
42void main(int argc, char* argv[])
43{
44 int c;
45 unsigned int n = 0;
46 unsigned int m = 0;
47 unsigned int p = 0;
48
49 int *m1;
50 int *m2;
51 int *r;
52
53 while((c = getopt(argc, argv, "n:m:p:")) != -1)
54 {
55 switch (c)
56 {
57 case 'n':
58 sscanf(optarg, "%u", &n);
59 break;
60 case 'm':
61 sscanf(optarg, "%u", &m);
62 break;
63 case 'p':
64 sscanf(optarg, "%u", &p);
65 break;
66 case 'h':
67 printUsage();
68 exit(0);
69 break;
70 default:
71 printUsage();
72 exit(2);
73 }
74 }
75
76 if (n == 0)
77 fprintf(stderr, "n is zero\n");
78 if (m == 0)
79 fprintf(stderr, "m is zero\n");
80 if (p == 0)
81 fprintf(stderr, "p is zero\n");
82
83 if (n == 0 || m == 0 || p == 0)
84 {
85 printUsage();
86 exit(2);
87 }
88
89 m1 = malloc(sizeof(int) * n * m);
90 m2 = malloc(sizeof(int) * m * p);
91 r = malloc(sizeof(int) * n * p);
92
93 srand(RANDOM_SEED);
94 generateMatrix(m1, n, m);
95 generateMatrix(m2, m, p);
96
97 matrixMultiply(m1, m2, r, n, m, p);
98
99 for (int h = 0; h < (n > m ? n : m); h++)
100 {
101 if (h < n)
102 {
103 printf("(");
104 for (int w = 0; w < m; w++)
105 {
106 printf(" %5d", m1[h * n + w]);
107 }
108 printf(" )");
109 }
110 else
111 {
112 printf(" ");
113 for (int w = 0; w < m; w++)
114 printf(" %5s", "");
115 }
116
117 if (h == 0)
118 printf(" * ");
119 else
120 printf(" ");
121
122 if (h < m)
123 {
124 printf("(");
125 for (int w = 0; w < p; w++)
126 {
127 printf(" %5d", m2[h * p + w]);
128 }
129 printf(" )");
130 }
131 else
132 {
133 printf(" ");
134 for (int w = 0; w < p; w++)
135 printf(" %5s", "");
136 }
137
138 if (h == 0)
139 printf(" = ");
140 else
141 printf(" ");
142
143 if (h < n)
144 {
145 printf("(");
146 for (int w = 0; w < p; w++)
147 {
148 printf(" %5d", r[h * p + w]);
149 }
150 printf(" )");
151 }
152 else
153 {
154 printf(" ");
155 for (int w = 0; w < p; w++)
156 printf(" %5s", "");
157 }
158
159 printf("\n");
160 }
161
162 free(m1); free(m2); free(r);
163}