proc newSparseMatrix*(m: Matrix): SparseMatrix = for i in0 ..< m.rows: for j in0 ..< m.cols: let value = m.data[i][j] if value != 0: result.data[(i, j)] = value
proc len*(s: SparseMatrix): int = s.data.len
proc `[]`*(s: SparseMatrix, idx: (int, int)): float = if idx in s.data: s.data[idx] else: 0.0
proc `[]`*(s: SparseMatrix, idx: Slice[int]): float = let idx = (idx.a, idx.b) if idx in s.data: s.data[idx] else: 0.0