You are on page 1of 4

# CSE 232

Fall 2014

Programming Project #9
Assignment Overview
You will create a sparse matrix data structure using an underlying STL map and overload
various binary operators to exercise the data structure
This assignment is worth 50 points (5.0% of the course grade) and must be completed
and turned in before 11:59PM on Monday, Nov 17th . This is two weeks because of the
midterm on Nov 6th.
Background
A sparse matrix is a regular mathematical matrix where most of the elements have a 0
value. They are often used in science and engineering applications (see
http://en.wikipedia.org/wiki/Sparse_matrix ). Because they have 0's as most of the values,
special data structures and algorithms are required to be efficient in their use.
A Different Specification
The specification for this project will be a little different. In the past we have provided
both a main and a header file. From now on we will only provide the main. Your job is to
design the class to meet the specifications as provided by the main and that meets the
notes below.
One file
What you will turn in is a single file that contains the class declaration and the definitions.
If you need examples of how to do that, look at worksheets 14 and 15. This makes the
grading process easier. No other reason than that.
Updated 11/6. You will turn in two files: class-09.h and class-09.cpp Handin will allow
turning in both files.
Specifications
the underlying data structure will be a map. It will map a pair<long,long>
(representing the row,column address respectively) to a long .
constructors
o two arg: two longs indicating the number of rows and columns respectively.
SparseMatrix mat(100,50) makes mat with 50 rows each with 100
colums 100 rows with 50 columns each
o three arg: two longs indicating row and column, and an initializer list of longs.
The longs come in triples where each triple indicates: row, column, value to
be set in the matrix. SparseMatrix
mat2(5,5,{1,1,100,2,2,200}) makes mat2 a 5x5 matrix with the
value at 1,1 set to 100 and the value at 2,2 set to 200
operator(row,col) . Takes two args (row,col) and returns a long.

o The two argument longs indicate row and column and return either 0 or, if the
location's value has been set, the value. mat(1,1) will return either a 0 or
the value set at 1,1.
o You could overload a subscript operator (operator[]) but only with one
argument, the index of the element. If you want two indicies like
(row,column), you overload operator(). This operator is usually
interpreted as the function operator, but for now it will be the accessor
function. Note: It cannot be used to set a value, only return it.
.set(row,col,val) method. Takes 3 args: row, column and value. No return.
o Sets the value of the matrix at location row,column to value.
.dimensions() method. No args, returns a pair<long,long>
o returns the dimension (the row and column size) of the matrix
.element_count() method. No args, returns a long
o returns the number of non-default values in the matrix

Operations supported
addition between two matrices. Example shown below
addition between a matrix and a long.
o Should be commutative: 5 + mat == mat + 5
o Note: we make the decision that, for scalar addition, we only modify the
non-default values. Could be done differently, but that is what we do here.
multiplication between two matrices. Example shown below
multiplication between a matrix and a long
o should be commutative as addition with long
o since the default value is 0, the only values potentially changed are the
non-default values
printing. Should be able to print using cout << mat << mat2 <<endl;
o only non-default values are printed
o those values are printed in order
smallest row first
within the row, smallest column first
Errors
Certain errors require that you throw an exception. We cover exceptions in lab10 this
week. Summary, throw a runtime_error if you run into any of the following issues:
matrix-matrix addition requires that the two matrices have the same dimensions, the
same row and column size
matrix-matrix multiplication require that the row column size of the first matrix have
the same size as the column row size of the second matrix
Anything else you need!!!
You are defining your class, so any other functions/members you might need, feel free to
add them. The test will only involve using the main provided.
Important things to Note

1. You should try to make your code efficient. One of the things you learn is that
efficiency should come after you get the thing to work. So getting it to work should
be the most important goal. But afterwards, think about how to make it more efficient.
If you have a 1000x1000 matrix (106 elements) and only 1000 non-default values (say
the identity matrix), it would be wasteful, though not incorrect, to do 106 adds or 106
a. it's easier to be efficient with adds, much easier, than with multiplies.
2. Don't worry about any of the errors to begin with. Write correct code and see if it runs

matrix + matrix

matrix + scalar
o adds the scalar to every element of the matrix.
o Remember, for our SparseMatrix, we only modify non-default values
1 2
6
7
3 4 + 5 = 8
9
5 6
10 11

Multiply Matricies
See http://en.wikipedia.org/wiki/Matrix_multiplication

matrix * long

matrix * matrix

Multiply Matricies
Deliverables