Mercurial > hg > may
diff yetilab/matrix/matrix.yeti @ 214:709fba377099 matrix_opaque_immutable
Update matrix
author | Chris Cannam |
---|---|
date | Sat, 11 May 2013 11:39:09 +0100 |
parents | 9997752223b8 |
children | 77c6a81c577f |
line wrap: on
line diff
--- a/yetilab/matrix/matrix.yeti Sat May 11 11:27:34 2013 +0100 +++ b/yetilab/matrix/matrix.yeti Sat May 11 11:39:09 2013 +0100 @@ -1,7 +1,7 @@ module yetilab.matrix.matrix; -// A matrix is an array of blocks. +// A matrix is an array of vectors. // A matrix can be stored in either column-major (the default) or // row-major format. Storage order is an efficiency concern only: @@ -9,10 +9,12 @@ // result regardless of storage order. (The transpose function just // switches the row/column order without moving the elements.) -bl = load yetilab.block.block; +//!!! check that we are not unnecessarily copying in the transform functions + +vec = load yetilab.block.vector; bf = load yetilab.block.blockfuncs; -load yetilab.block.blocktype; +load yetilab.block.vectortype; load yetilab.matrix.matrixtype; size m = @@ -21,12 +23,12 @@ major = length r; { rows = major, - columns = if major > 0 then bl.length r[0] else 0 fi, + columns = if major > 0 then vec.length r[0] else 0 fi, }; ColM c: major = length c; { - rows = if major > 0 then bl.length c[0] else 0 fi, + rows = if major > 0 then vec.length c[0] else 0 fi, columns = major, }; esac; @@ -36,27 +38,29 @@ getAt row col m = case m of - RowM rows: r = rows[row]; (bl.data r)[col]; - ColM cols: c = cols[col]; (bl.data c)[row]; + RowM rows: r = rows[row]; vec.at col r; + ColM cols: c = cols[col]; vec.at row c; esac; getColumn j m = case m of - RowM rows: bl.fromList (map do i: getAt i j m done [0..length rows-1]); + RowM rows: vec.fromList (map do i: getAt i j m done [0..length rows-1]); ColM cols: cols[j]; esac; getRow i m = case m of RowM rows: rows[i]; - ColM cols: bl.fromList (map do j: getAt i j m done [0..length cols-1]); + ColM cols: vec.fromList (map do j: getAt i j m done [0..length cols-1]); esac; +/* setAt row col n m = //!!! dangerous, could modify copies -- should it be allowed? case m of - RowM rows: r = rows[row]; (bl.data r)[col] := n; - ColM cols: c = cols[col]; (bl.data c)[row] := n; + RowM rows: r = rows[row]; (vec.data r)[col] := n; + ColM cols: c = cols[col]; (vec.data c)[row] := n; esac; +*/ isRowMajor? m = case m of @@ -66,7 +70,7 @@ newColMajorStorage { rows, columns } = if rows < 1 then array [] - else array (map \(bl.zeros rows) [1..columns]) + else array (map \(vec.zeros rows) [1..columns]) fi; zeroMatrix { rows, columns } = @@ -79,19 +83,23 @@ ColM (newColMajorStorage { rows, columns }); fi; +zeroSizeMatrix () = zeroMatrix { rows = 0, columns = 0 }; + generate f { rows, columns } = - (m = newColMajorStorage { rows, columns }; - for [0..columns-1] do col: - for [0..rows-1] do row: - (bl.data m[col])[row] := f row col; + if rows < 1 or columns < 1 then zeroSizeMatrix () + else + m = array (map \(new double[rows]) [1..columns]); + for [0..columns-1] do col: + for [0..rows-1] do row: + m[col][row] := f row col; + done; done; - done; - ColM m); + ColM (array (map vec.vector m)) + fi; constMatrix n = generate do row col: n done; randomMatrix = generate do row col: Math#random() done; identityMatrix = constMatrix 1; -zeroSizeMatrix () = zeroMatrix { rows = 0, columns = 0 }; transposed m = case m of @@ -120,23 +128,25 @@ if size m1 != size m2 then false elif isRowMajor? m1 != isRowMajor? m2 then equal (flipped m1) m2; else - compare d1 d2 = all id (map2 bl.equal d1 d2); + compare d1 d2 = all id (map2 vec.equal d1 d2); case m1 of RowM d1: case m2 of RowM d2: compare d1 d2; _: false; esac; ColM d1: case m2 of ColM d2: compare d1 d2; _: false; esac; esac fi; +/*!!! not needed now it's immutable? copyOf m = - (copyOfData d = (array (map bl.copyOf d)); + (copyOfData d = (array (map vec.copyOf d)); case m of RowM d: RowM (copyOfData d); ColM d: ColM (copyOfData d); esac); +*/ newMatrix type data = //!!! NB does not copy data (tagger = case type of RowMajor (): RowM; ColumnMajor (): ColM esac; - if empty? data or bl.empty? (head data) + if empty? data or vec.empty? (head data) then zeroSizeMatrix () else tagger (array data) fi); @@ -176,7 +186,7 @@ (n = counter (size (head mm)); tagger (array (map do i: - bl.concat (map (getter i) mm) + vec.concat (map (getter i) mm) done [0..n-1]))); concatWithGrain tagger getter counter mm = @@ -222,14 +232,14 @@ if isRowMajor? m then RowM (array (map ((flip getRow) m) [start .. start + count - 1])) else - ColM (array (map (bl.rangeOf start count) (asColumns m))) + ColM (array (map (vec.rangeOf start count) (asColumns m))) fi; columnSlice start count m = //!!! doc: storage order same as input if not isRowMajor? m then ColM (array (map ((flip getColumn) m) [start .. start + count - 1])) else - RowM (array (map (bl.rangeOf start count) (asRows m))) + RowM (array (map (vec.rangeOf start count) (asRows m))) fi; resizedTo newsize m = @@ -268,7 +278,7 @@ getAt, getColumn, getRow, - setAt, +// setAt, isRowMajor?, generate, constMatrix, @@ -277,7 +287,7 @@ identityMatrix, zeroSizeMatrix, equal, - copyOf, +// copyOf, transposed, flipped, toRowMajor, @@ -303,9 +313,9 @@ width is matrix -> number, height is matrix -> number, getAt is number -> number -> matrix -> number, - getColumn is number -> matrix -> block, - getRow is number -> matrix -> block, - setAt is number -> number -> number -> matrix -> (), //!!! lose? + getColumn is number -> matrix -> vector, + getRow is number -> matrix -> vector, +// setAt is number -> number -> number -> matrix -> (), //!!! lose? isRowMajor? is matrix -> boolean, generate is (number -> number -> number) -> { .rows is number, .columns is number } -> matrix, constMatrix is number -> { .rows is number, .columns is number } -> matrix, @@ -314,22 +324,22 @@ identityMatrix is { .rows is number, .columns is number } -> matrix, zeroSizeMatrix is () -> matrix, equal is matrix -> matrix -> boolean, - copyOf is matrix -> matrix, +// copyOf is matrix -> matrix, transposed is matrix -> matrix, flipped is matrix -> matrix, toRowMajor is matrix -> matrix, toColumnMajor is matrix -> matrix, scaled is number -> matrix -> matrix, resizedTo is { .rows is number, .columns is number } -> matrix -> matrix, - asRows is matrix -> list<block>, - asColumns is matrix -> list<block>, + asRows is matrix -> list<vector>, + asColumns is matrix -> list<vector>, sum is matrix -> matrix -> matrix, product is matrix -> matrix -> matrix, concat is (Horizontal () | Vertical ()) -> list<matrix> -> matrix, rowSlice is number -> number -> matrix -> matrix, columnSlice is number -> number -> matrix -> matrix, - newMatrix is (ColumnMajor () | RowMajor ()) -> list<block> -> matrix, - newRowVector is block -> matrix, - newColumnVector is block -> matrix, + newMatrix is (ColumnMajor () | RowMajor ()) -> list<vector> -> matrix, + newRowVector is vector -> matrix, + newColumnVector is vector -> matrix, }