annotate floatrix.yeti @ 8:dc72a1d15901

Add mixedDown, start framer
author Chris Cannam
date Wed, 12 Dec 2012 22:22:02 +0000
parents c5dc45708e74
children 1c5b70c79859
rev   line source
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