Mercurial > hg > may
view fmatrix.yeti @ 12:2afcb56f57b1
Add (rather clumsy) overlapping framer
author | Chris Cannam |
---|---|
date | Thu, 13 Dec 2012 16:21:07 +0000 |
parents | 149d6911ca12 |
children | 0ddc2aa8885d |
line wrap: on
line source
module fmatrix; vec = load fvector; zeroMatrix rows cols = array (map \(vec.zeros cols) [1..rows]); generateMatrix f rows cols = (m = zeroMatrix rows cols; for [0..rows-1] do row: for [0..cols-1] do col: m[row][col] := f row col; done; done; m); constMatrix n = generateMatrix do row col: n done; randomMatrix = generateMatrix do row col: Math#random() done; identityMatrix = constMatrix 1; width m = if length m > 0 then vec.vectorLength m[0] else 0 fi; cols = width; height m = length m; rows = height; dimensions m = { cols = width m, rows = height m }; copyOfMatrix m = array (map vec.copyOfVector m); transposed m is array<~double[]> -> array<~double[]> = generateMatrix do row col: m[col][row] done (cols m) (rows m); interleaved m = ({ cols, rows } = dimensions m; v = vec.zeros (cols * rows); for [0..rows-1] do row: for [0..cols-1] do col: v[col * rows + row] := m[row][col]; done; done; v); deinterleaved rows v is number -> ~double[] -> array<~double[]> = generateMatrix do row col: v[rows * col + row] done rows ((vec.vectorLength v) / rows); mixedDown m = (if empty? m then vec.zeros 0 else { cols, rows } = dimensions m; v = vec.copyOfVector m[0]; for [1..rows-1] do row: for [0..cols-1] do col: v[col] := v[col] + m[row][col]; done; done; v; fi); mixedDownFromInterleaved rows v is number -> ~double[] -> ~double[] = (cols = ((vec.vectorLength v) / rows); v' = vec.zeros cols; for [0..rows-1] do row: for [0..cols-1] do col: v'[col] := v'[col] + v[col * rows + row]; done; done; v'); { generateMatrix, constMatrix, randomMatrix, zeroMatrix, identityMatrix, width, cols, height, rows, dimensions, copyOfMatrix, transposed, interleaved, deinterleaved, mixedDown, mixedDownFromInterleaved, }