Chris@1: module matrix; Chris@1: Chris@18: // Basic matrices using number type (rather than primitive arrays) Chris@18: Chris@2: zeros n = array(map \0 [1..n]); Chris@2: ones n = array(map \1 [1..n]); Chris@1: Chris@2: generateMatrix f rows cols = array Chris@2: (map do row: array Chris@2: (map (f row) [0..cols-1]) Chris@2: done [0..rows-1]); Chris@1: Chris@2: constMatrix n = generateMatrix do row col: n done; Chris@1: Chris@2: randomMatrix = generateMatrix do row col: Math#random() done; Chris@2: Chris@2: zeroMatrix = constMatrix 0; Chris@2: identityMatrix = constMatrix 1; Chris@2: Chris@2: width m = if length m > 0 then length m[0] else 0 fi; Chris@2: Chris@2: height m = length m; Chris@2: Chris@3: dimensions m = { cols = width m, rows = height m }; Chris@3: Chris@2: transposed m = array Chris@2: (map do n: array Chris@2: (map do a: a[n-1] done m) Chris@2: done [1..width m]); Chris@2: Chris@2: interleaved m = array(concat(transposed m)); Chris@2: Chris@3: deinterleaved rows v = Chris@3: generateMatrix do row col: Chris@3: v[rows * col + row] Chris@3: done rows (length v / rows); Chris@2: Chris@3: { Chris@3: zeros, ones, Chris@3: generateMatrix, constMatrix, randomMatrix, zeroMatrix, identityMatrix, Chris@3: width, height, dimensions, Chris@3: transposed, Chris@3: interleaved, deinterleaved, Chris@3: } Chris@3: