Mercurial > hg > may
diff yetilab/matrix/matrix.yeti @ 258:f3b7b5d20f88
Replace matrix thresholded with a more general filter function that works for sparse matrices too
author | Chris Cannam |
---|---|
date | Wed, 22 May 2013 08:56:51 +0100 |
parents | f00ab8baa6d7 |
children | fae62dca8048 |
line wrap: on
line diff
--- a/yetilab/matrix/matrix.yeti Tue May 21 22:37:28 2013 +0100 +++ b/yetilab/matrix/matrix.yeti Wed May 22 08:56:51 2013 +0100 @@ -356,11 +356,6 @@ newColumnVector data = //!!! NB does not copy data DenseCols (array [data]); -thresholded threshold m = //!!! v inefficient; and should take a threshold function? - generate do row col: - v = getAt row col m; if (abs v) > threshold then v else 0 fi - done (size m); - denseLinearOp op m1 m2 = if isRowMajor? m1 then newMatrix (RowMajor ()) @@ -434,6 +429,21 @@ newMatrix (ColumnMajor ()) (map bf.abs (asColumns m)); fi; +filter f m = + if isSparse? m then + makeSparse + if isRowMajor? m then (RowMajor ()) else (ColumnMajor ()) fi + (size m) + (map do { i, j, v }: { i, j, v = if f v then v else 0 fi } done (enumerate m)) + else + vfilter = vec.fromList . (map do i: if f i then i else 0 fi done) . vec.list; + if isRowMajor? m then + newMatrix (RowMajor ()) (map vfilter (asRows m)); + else + newMatrix (ColumnMajor ()) (map vfilter (asColumns m)); + fi; + fi; + sparseProductLeft size m1 m2 = (e = enumerateSparse m1; data = array (map \(new double[size.rows]) [1..size.columns]); @@ -627,13 +637,13 @@ toSparse, toDense, scaled, - thresholded, resizedTo, asRows, asColumns, sum = sum', difference, abs = abs', + filter, product, concat, rowSlice, @@ -680,6 +690,7 @@ sum is matrix -> matrix -> matrix, difference is matrix -> matrix -> matrix, abs is matrix -> matrix, + filter is (number -> boolean) -> matrix -> matrix, product is matrix -> matrix -> matrix, concat is (Horizontal () | Vertical ()) -> list<matrix> -> matrix, rowSlice is number -> number -> matrix -> matrix,