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