Chris@10: module fmatrix; Chris@5: Chris@10: vec = load fvector; Chris@9: Chris@10: zeroMatrix rows cols = array (map \(vec.zeros cols) [1..rows]); Chris@5: Chris@5: generateMatrix f rows cols = Chris@5: (m = zeroMatrix rows cols; Chris@5: for [0..rows-1] do row: Chris@5: for [0..cols-1] do col: Chris@9: m[row][col] := f row col; Chris@5: done; Chris@5: done; Chris@5: m); Chris@5: Chris@5: constMatrix n = generateMatrix do row col: n done; Chris@5: randomMatrix = generateMatrix do row col: Math#random() done; Chris@5: identityMatrix = constMatrix 1; Chris@5: Chris@10: width m = if length m > 0 then vec.vectorLength m[0] else 0 fi; Chris@6: cols = width; Chris@6: Chris@5: height m = length m; Chris@6: rows = height; Chris@6: Chris@5: dimensions m = { cols = width m, rows = height m }; Chris@5: Chris@10: copyOfMatrix m = array (map vec.copyOfVector m); Chris@9: Chris@6: transposed m is array<~double[]> -> array<~double[]> = Chris@6: generateMatrix do row col: m[col][row] done (cols m) (rows m); Chris@6: Chris@7: interleaved m = Chris@7: ({ cols, rows } = dimensions m; Chris@10: v = vec.zeros (cols * rows); Chris@7: for [0..rows-1] do row: Chris@7: for [0..cols-1] do col: Chris@7: v[col * rows + row] := m[row][col]; Chris@7: done; Chris@7: done; Chris@7: v); Chris@6: Chris@8: deinterleaved rows v is number -> ~double[] -> array<~double[]> = Chris@5: generateMatrix do row col: Chris@5: v[rows * col + row] Chris@10: done rows ((vec.vectorLength v) / rows); Chris@5: Chris@9: mixedDown m = Chris@10: (if empty? m then vec.zeros 0 else Chris@9: { cols, rows } = dimensions m; Chris@10: v = vec.copyOfVector m[0]; Chris@9: for [1..rows-1] do row: Chris@9: for [0..cols-1] do col: Chris@9: v[col] := v[col] + m[row][col]; Chris@9: done; Chris@9: done; Chris@9: v; Chris@9: fi); Chris@9: Chris@9: mixedDownFromInterleaved rows v is number -> ~double[] -> ~double[] = Chris@10: (cols = ((vec.vectorLength v) / rows); Chris@10: v' = vec.zeros cols; Chris@9: for [0..rows-1] do row: Chris@9: for [0..cols-1] do col: Chris@9: v'[col] := v'[col] + v[col * rows + row]; Chris@9: done; Chris@8: done; Chris@9: v'); Chris@8: Chris@5: { Chris@5: generateMatrix, constMatrix, randomMatrix, zeroMatrix, identityMatrix, Chris@6: width, cols, height, rows, dimensions, Chris@10: copyOfMatrix, Chris@7: transposed, interleaved, deinterleaved, Chris@9: mixedDown, mixedDownFromInterleaved, Chris@5: } Chris@5: