forked from PierreSenellart/matrix_tutorial
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmatrix.c
More file actions
95 lines (79 loc) · 1.81 KB
/
matrix.c
File metadata and controls
95 lines (79 loc) · 1.81 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
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "matrix.h"
#define PRINT_PRECISION "6"
#define PRINT_DECIMAL_PRECISION "2"
matrix matrix_create(unsigned n1, unsigned n2, scalar v)
{
matrix m={n1,n2,true,NULL};
if(n1==0 || n2==0)
return m;
else if(SIZE_MAX / n1 <= n2)
m.ok = false;
else if (!(m.data=calloc(((size_t) n1)*n2, sizeof(scalar))))
m.ok = false;
else {
for(unsigned i=0; i<n1; ++i)
for(unsigned j=0; j<n2; ++j)
*matrix_get(m,i,j) = v;
}
return m;
}
matrix matrix_identity(unsigned n)
{
matrix m = matrix_create(n, n, 0.);
if(!m.ok)
return m;
for(unsigned i=0; i<n; ++i)
*matrix_get(m, i, i) = 1.;
return m;
}
void matrix_destroy(matrix m)
{
if(m.ok) {
m.ok = false;
free(m.data);
}
}
scalar *matrix_get(matrix m, unsigned i, unsigned j)
{
if(!m.ok || i>m.n1 || i>m.n2)
return NULL;
return &m.data[i*m.n2+j];
}
matrix matrix_add(matrix m, matrix n)
{
matrix res={0,0,false,NULL};
if(m.n1!=n.n1 || m.n2!=n.n2 || !m.ok || !n.ok)
return res;
res=matrix_create(m.n1, m.n2, 0.);
for(unsigned i=0; i<m.n1; ++i)
for(unsigned j=0; j<m.n2; ++j)
*matrix_get(res, i, j) = *matrix_get(m, i, j) + *matrix_get(n, i, j);
return res;
}
matrix matrix_mult_scal(matrix m, scalar v){
matrix res = matrix_create(m.n1, m.n2, 0.);
for(int i = 0; i < m.n1; i++){
for(int j = 0; j < m.n2; j++){
*matrix_get(res, i, j) = v* (*matrix_get(m,i,j));
}
}
return res;
}
void matrix_print(FILE *f, matrix m)
{
if(!m.ok)
fprintf(f, "Invalid matrix\n");
else {
for(unsigned i=0; i<m.n1; ++i) {
for(unsigned j=0; j<m.n2; ++j)
fprintf(
f,
"%"PRINT_PRECISION"."PRINT_DECIMAL_PRECISION"f ",
*matrix_get(m, i, j));
fprintf(f, "\n");
}
}
}