summaryrefslogtreecommitdiff
path: root/linalg.h
blob: 5613100de35a3c460b69f08a2ed7ff59eae26cab (plain)
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
97
98
99
100
101
102
103
104
105
106
107
108
#pragma	src	"/usr/doc/src/linalg"
#pragma	lib	"liblinalg.a"

typedef float real;
extern const float meps;

/* Cubes, matrics, and Vector data types */

/* Morton ordering */
#define evenbits 0xAAAAAAAA
#define oddbits 0x55555555
//#define threebits 0x49249249
#define oinc2(i) (((i) - oddbits) & oddbits)
#define einc2(i) (((i) - evenbits) & evenbits)
#define odec2(i) (((i) - 1) & oddbits)
#define edec2(i) (((i) - 1) & evenbits)
#define tr(i, j) (((i) << 1) | ((j) >> 1))
ushort undilate2(uint);
uint dilate2(ushort);

/* Iterators */
#define miter(m, i) for((i) = 0; (i) < (m)->len; (i)++) if(mbndok((m), (i)))
#define viter(v, i) for((i) = 0; (i) < (v)->len; (i)++)

typedef struct block block;
typedef struct cube cube;
typedef struct matrix matrix;
typedef struct vector vector;

#define C(x, i, j, k) ((x)->data[(k) * (x)->stride + (dilate2(i) | (dilate2(j) << 1))])
#define CV(x, i, k) ((x)->data[(k) * (x)->stride + (i)])
#define M(x, i, j) ((x)->data[dilate2(i) | (dilate2(j) << 1)])
#define V(x, i) ((x)->data[(i)])

#define mbndok(a, i) (((i) & oddbits) < (a)->mr && ((i) & evenbits) < (a)->mc)

struct block{
	real *data;
	ulong sz;
	uchar allocated:1;
};

struct vector {
	block;
	uint len;
};

struct matrix{
	vector;
	ushort nr, nc;
	uint mr, mc;
	uint levels, offset;
};

struct cube{
	matrix;
	ushort ns;
	uint stride;
};

cube *ncube(cube *, real *, ushort, ushort, ushort);
matrix *nmatrix(matrix *, real *, ushort, ushort);
vector *nvector(vector *, real *, uint);

void fblock(block *);
block *zblock(block *);
block *cblock(block *, block *);

matrix *qdot(matrix *, matrix *, matrix *, int);
matrix *mdot(matrix *, matrix *, matrix *, int);
matrix *madd(matrix *, matrix *, matrix *);
matrix *smprod(real, matrix *, matrix *);
real dot(vector *, vector *);
vector *sprod(real, vector *, vector *);
vector *vadd(vector *, vector *, vector *);
vector *vprod(vector *, vector *, vector *);
vector *vsub(vector *, vector *, vector *);
vector *vdot(matrix *, vector *, vector *, int);
void vnorm(uint, ...);

void vsort(vector *);
uint *ivsort(vector *);

extern uint MAXITERS;
matrix *eigen(matrix *, matrix *, vector *);
matrix *jacobi(matrix *, matrix *, vector *);
matrix *tridiag(matrix *, matrix *, matrix *);
matrix *nystrom(matrix *, matrix *, vector *);
matrix *qr(matrix *, matrix *, matrix *);
matrix *gs(matrix *);

real entropy(matrix *);
matrix *mahalanobis(matrix *, matrix *);
matrix *msqrt(matrix *, matrix *);
matrix *minv(matrix *, matrix *, real);
vector *solve(matrix *, vector *, vector *);

void svd(matrix *, matrix *, vector *, matrix *);

matrix *col(matrix *, matrix *, uint);
matrix *row(matrix *, matrix *, uint);
matrix *slice(cube *, matrix *, uint);
vector *drop(matrix *, vector *);
matrix *raise(vector *, matrix *);
matrix *trans(matrix *, matrix *);
matrix *diag(vector *, matrix *);
vector *msum(matrix *, vector *, uint);
vector *getdiag(matrix *, vector *);