Repository navigation
Expand file tree
/
Copy pathmatrix_arithmetic.cc
More file actions
97 lines (73 loc) · 1.94 KB
/
Copy pathmatrix_arithmetic.cc
File metadata and controls
97 lines (73 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "error.h"
#include "matrix.h"
#include "arithmetic.h"
#include <stdio.h>
#include <stdlib.h>
typedef double (*operation)(double, double);
void
matrix_operation(matrix_t *m1,
matrix_t const *m2,
operation op,
char const *name)
{
uint i, j;
information("Operation '%s' (%d, %d) => (%d, %d)\n",
name, m1->m, m1->n, m2->m, m2->n);
matrix_compatible(m1, m2);
for (i = 0; i < m1->m; ++i) {
for (j = 0; j < m1->n; ++j) {
m1->data[i][j] = op(m1->data[i][j], m2->data[i][j]);
}
}
}
matrix_t*
matrix_operation(matrix_t const *m1,
matrix_t const *m2,
operation op,
char const *name)
{
matrix_t *mr;
information("Operation '%s' (%d, %d) => (%d, %d)\n",
name, m1->m, m1->n, m2->m, m2->n);
matrix_compatible(m1, m2);
if (NULL == (mr = matrix_malloc(m1->m, m1->n))) {
die("Failed to allocate output matrix.\n");
}
matrix_copy(mr, m1);
matrix_operation(mr, m2, op, name);
return mr;
}
#define MTX_OP(name) \
void matrix_##name(matrix_t *m1, matrix_t const *m2) \
{ matrix_operation(m1, m2, name, #name); } \
matrix_t* matrix_##name(matrix_t const *m1, matrix_t const *m2) \
{ return matrix_operation(m1, m2, name, #name); }
MTX_OP(add)
MTX_OP(subtract)
void
matrix_multiply(matrix_t *mr, matrix_t const *m1, matrix_t const *m2)
{
uint i, j, k;
information("Operation 'Multiplication' (%d, %d) => (%d, %d)\n",
m1->m, m1->n, m2->m, m2->n);
matrix_compatible(m1, m2);
for (i = 0; i < m1->m; ++i) {
for (j = 0; j < m1->n; ++j) {
mr->data[i][j] = 0.0;
for (k = 0; k < m1->n; ++k) {
mr->data[i][j] += m1->data[i][k] * m2->data[k][j];
}
}
}
}
matrix_t*
matrix_multiply(matrix_t const *m1, matrix_t const *m2)
{
matrix_t *mr;
matrix_compatible(m1, m2);
if (NULL == (mr = matrix_malloc(m1->m, m1->n))) {
die("Failed to allocate output matrix.\n");
}
matrix_multiply(mr, m1, m2);
return mr;
}