# Example 4: Sparse Matrices

There are two different sparse matrix types provided by ViennaCL, **compressed_matrix** and **coordinate_matrix**. In the current release of ViennaCL, the use of compressed_matrix is encouraged over coordinate_matrix, since compute kernels for the latter require additional optimizations.

**compressed_matrix<T, A>** represents a sparse matrix using a compressed sparse row scheme. *T* is the floating point type. *A* is the alignment and defaults to 1 at present.

The second type, **coordinate_matrix<T, A>**, represents a sparse matrix where entries are stored as triplets *(i,j,val)*, where *i* is the row index, *j* is the column index and *val* is the entry. Again, *T* is the floating point type. *A* is the alignment and defaults to 128 at present.

In general, sparse matrices should be set up on the CPU and then be pushed to the compute device using *copy()*, because the management of map based sparse matrices is inefficient on most compute devices such as GPUs.

typedef float ScalarType; //typedef double ScalarType; //use this if your GPU supports double precision // Set up a few ViennaCL objects: viennacl::compressed_matrix<ScalarType> vcl_compressed_matrix; viennacl::coordinate_matrix<ScalarType> vcl_coordinate_matrix; viennacl::vector<ScalarType> vcl_rhs; viennacl::vector<ScalarType> vcl_result; /* set up right hand side vector vcl_rhs as in the other examples */ // copy data from a sparse matrix on the CPU to the GPU: copy(cpu_sparse_matrix, vcl_compressed_matrix); copy(cpu_sparse_matrix, vcl_coordinate_matrix); // ViennaCL only allows to compute matrix-vector products for sparse matrix types: vcl_result = viennacl::linalg::prod(vcl_compressed_matrix, vcl_rhs); vcl_result = viennacl::linalg::prod(vcl_coordinate_matrix, vcl_rhs);