# HG changeset patch # User Chris Cannam # Date 1369063337 -3600 # Node ID 0ac8672d12b2136a2ead8d529ef2889cc8bb0817 # Parent e777a713027bb157939e2d997af2c23f2071072a Add and test sparsity diff -r e777a713027b -r 0ac8672d12b2 yetilab/matrix/matrix.yeti --- a/yetilab/matrix/matrix.yeti Mon May 20 16:01:43 2013 +0100 +++ b/yetilab/matrix/matrix.yeti Mon May 20 16:22:17 2013 +0100 @@ -46,6 +46,21 @@ width m = (size m).columns; height m = (size m).rows; +sparsity m = + ({ rows, columns } = size m; + cells = rows * columns; + nonZeroCells d = + sum + (map do v: + sum (map do n: if n == 0 then 0 else 1 fi done (vec.list v)) + done d); + case m of + DenseRows d: (nonZeroCells d) / cells; + DenseCols d: (nonZeroCells d) / cells; + SparseCSR d: (vec.length d.values) / cells; + SparseCSC d: (vec.length d.values) / cells; + esac); + sparseSlice n d = (start = d.pointers[n]; end = d.pointers[n+1]; @@ -444,6 +459,7 @@ size, width, height, + sparsity, getAt, getColumn, getRow, @@ -485,6 +501,7 @@ size is matrix -> { .rows is number, .columns is number }, width is matrix -> number, height is matrix -> number, + sparsity is matrix -> number, getAt is number -> number -> matrix -> number, getColumn is number -> matrix -> vector, getRow is number -> matrix -> vector, diff -r e777a713027b -r 0ac8672d12b2 yetilab/matrix/test/test_matrix.yeti --- a/yetilab/matrix/test/test_matrix.yeti Mon May 20 16:01:43 2013 +0100 +++ b/yetilab/matrix/test/test_matrix.yeti Mon May 20 16:22:17 2013 +0100 @@ -348,6 +348,12 @@ (newMatrix (RowMajor ()) [[0,3],[6,7]]) ), +"sparsity-\(name)": \( + compare (mat.sparsity (newMatrix (ColumnMajor ()) [[1,2,0],[0,5,0]])) (3/6) and + compare (mat.sparsity (newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]])) (6/6) and + compare (mat.sparsity (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,0]])) 0 +), + ]); colhash = makeTests "column-dense" id;