handle sparse matrices