Mercurial > hg > may
changeset 18:12c6f103ba8e
More experiments with tagged types; I don't feel this is going in the right direction though
author | Chris Cannam |
---|---|
date | Mon, 17 Dec 2012 14:45:55 +0000 |
parents | e2c834980152 |
children | 327dac3a8e1f |
files | block.yeti blockmatrix.yeti fmatrix.yeti matrix.yeti |
diffstat | 4 files changed, 67 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/block.yeti Mon Dec 17 12:47:08 2012 +0000 +++ b/block.yeti Mon Dec 17 14:45:55 2012 +0000 @@ -5,37 +5,38 @@ zeros n = Block new double[n]; -deblock b is (Block ~double[]) -> ~double[] = +unblock b is (Block ~double[]) -> ~double[] = case b of Block a: a esac; ones n = - (v = deblock (zeros n); + (v = unblock (zeros n); for [0..n-1] do i: v[i] := 1.0 done; Block v); block l is list?<number> -> (Block ~double[]) = (arr = array(l); len = length arr; - v = deblock (zeros len); + v = unblock (zeros len); for [0..len-1] do i: v[i] := arr[i] done; Block v); -arrayWrap b is (Block ~double[]) -> array<number> = - array(deblock b); +norec list b is (Block ~double[]) -> list<number> = + list (unblock b); -blockLength b = - length (arrayWrap b); +norec length b = + length (list b); -copyOfBlock b is (Block ~double[]) -> (Block ~double[]) = - (v = deblock b; - Block Arrays#copyOf(v, length(arrayWrap b))); +copyOf b is (Block ~double[]) -> (Block ~double[]) = + (v = unblock b; + Block Arrays#copyOf(v, length b)); -subBlock b start len is (Block ~double[]) -> number -> number -> (Block ~double[]) = - Block Arrays#copyOfRange(deblock b, start, start + len); +subset b start len is (Block ~double[]) -> number -> number -> (Block ~double[]) = + Block Arrays#copyOfRange(unblock b, start, start + len); { -zeros, ones, block, -blockLength, -copyOfBlock, subBlock, +zeros, ones, +block, unblock, +length, +copyOf, subset, }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/blockmatrix.yeti Mon Dec 17 14:45:55 2012 +0000 @@ -0,0 +1,47 @@ +module blockmatrix; + +// Basic matrices using a Block for each row. I don't like this one, +// it's clumsy + +block = load block; + +zeroMatrix rows cols = array (map \(block.zeros cols) [1..rows]); + +generateMatrix f rows cols = + (m = zeroMatrix rows cols; + for [0..rows-1] do row: + (rb = block.unblock m[row]; + for [0..cols-1] do col: + rb[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 block.length 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 block.copyOf m); + +cell m row col = + (rb = block.unblock m[col]; + rb[row]); + +transposed m is array<Block ~double[]> -> array<Block ~double[]> = + generateMatrix do row col: cell m row col done (cols m) (rows m); + +{ +generateMatrix, constMatrix, randomMatrix, zeroMatrix, identityMatrix, +width, cols, height, rows, dimensions, +copyOfMatrix, +transposed, +} +