Chris@5
|
1 module floatrix;
|
Chris@5
|
2
|
Chris@5
|
3 zeros n = new double[n];
|
Chris@5
|
4 ones n = (a = zeros n; for [0..n-1] do i: a[i] := 1.0 done; a);
|
Chris@5
|
5
|
Chris@8
|
6 vector l is list?<number> -> ~double[] =
|
Chris@8
|
7 (arr = array(l);
|
Chris@8
|
8 len = length arr;
|
Chris@8
|
9 v = new double[len];
|
Chris@8
|
10 for [0..len-1] do i: n = arr[i]; v[i] := n done;
|
Chris@8
|
11 v);
|
Chris@8
|
12
|
Chris@5
|
13 zeroMatrix rows cols = array (map \(zeros cols) [1..rows]);
|
Chris@5
|
14
|
Chris@5
|
15 generateMatrix f rows cols =
|
Chris@5
|
16 (m = zeroMatrix rows cols;
|
Chris@5
|
17 for [0..rows-1] do row:
|
Chris@5
|
18 for [0..cols-1] do col:
|
Chris@5
|
19 n = f row col;
|
Chris@5
|
20 m[row][col] := n;
|
Chris@5
|
21 done;
|
Chris@5
|
22 done;
|
Chris@5
|
23 m);
|
Chris@5
|
24
|
Chris@5
|
25 constMatrix n = generateMatrix do row col: n done;
|
Chris@5
|
26
|
Chris@5
|
27 randomMatrix = generateMatrix do row col: Math#random() done;
|
Chris@5
|
28
|
Chris@5
|
29 identityMatrix = constMatrix 1;
|
Chris@5
|
30
|
Chris@5
|
31 arrayWrap a is ~double[] -> array<number> = array(a);
|
Chris@5
|
32
|
Chris@5
|
33 width m = if length m > 0 then length (arrayWrap m[0]) else 0 fi;
|
Chris@5
|
34
|
Chris@6
|
35 cols = width;
|
Chris@6
|
36
|
Chris@5
|
37 height m = length m;
|
Chris@5
|
38
|
Chris@6
|
39 rows = height;
|
Chris@6
|
40
|
Chris@5
|
41 dimensions m = { cols = width m, rows = height m };
|
Chris@5
|
42
|
Chris@6
|
43 transposed m is array<~double[]> -> array<~double[]> =
|
Chris@6
|
44 generateMatrix do row col: m[col][row] done (cols m) (rows m);
|
Chris@6
|
45
|
Chris@7
|
46 interleaved m =
|
Chris@7
|
47 ({ cols, rows } = dimensions m;
|
Chris@7
|
48 v = zeros (cols * rows);
|
Chris@7
|
49 for [0..rows-1] do row:
|
Chris@7
|
50 for [0..cols-1] do col:
|
Chris@7
|
51 v[col * rows + row] := m[row][col];
|
Chris@7
|
52 done;
|
Chris@7
|
53 done;
|
Chris@7
|
54 v);
|
Chris@6
|
55
|
Chris@8
|
56 deinterleaved rows v is number -> ~double[] -> array<~double[]> =
|
Chris@5
|
57 generateMatrix do row col:
|
Chris@5
|
58 v[rows * col + row]
|
Chris@7
|
59 done rows (length (arrayWrap v) / rows);
|
Chris@5
|
60
|
Chris@8
|
61 //!!! too inefficient!
|
Chris@8
|
62 mixedDown rows v is number -> ~double[] -> ~double[] =
|
Chris@8
|
63 (cols = (length (arrayWrap v) / rows);
|
Chris@8
|
64 mv = new double[cols];
|
Chris@8
|
65 for [0..cols-1] do col:
|
Chris@8
|
66 val = sum (map do row: v[col * rows + row] done [0..rows-1]) / rows;
|
Chris@8
|
67 mv[col] := val;
|
Chris@8
|
68 done;
|
Chris@8
|
69 mv);
|
Chris@8
|
70
|
Chris@5
|
71 {
|
Chris@8
|
72 zeros, ones, vector,
|
Chris@5
|
73 generateMatrix, constMatrix, randomMatrix, zeroMatrix, identityMatrix,
|
Chris@6
|
74 width, cols, height, rows, dimensions,
|
Chris@7
|
75 transposed, interleaved, deinterleaved,
|
Chris@8
|
76 mixedDown,
|
Chris@5
|
77 }
|
Chris@5
|
78
|