Starting from:

$29

Assignment 3 Implementing and testing classes

CSE 241 Programming Assignment 3
Description • If you think that this document does not clearly describes the assignment, ask questions before its too late. This assignment is about implementing and testing classes for sparse matrix operations. Sparse Matrix/Vector • A sparse matrix/vector holds only the non-zero data but acts as a regular matrix/vector. Basic Elements SparseVector Class • Represents a single dimensional sparse data. • Requirements: – SparseArray : Constructors ∗ Write the required constructors. For example, you need a constructor which takes a string filename data, opens the file, reads the contents, creates and populates an object. – operator+ : Adds two SparseVectors ∗ Usage: sparse_vec_1 + sparse_vec_2. ∗ Creates another SparseVector object. – operator- : Subtracts one SparseVector from another ∗ Similar to operator+ – operator- : Negates elements of a SparseVector ∗ Creates another SparseVector object which is element-by-element negative of the operant. – operator= : Assigns one SparseVector to another ∗ Usage: sparse_vec_1 = sparse_vec_2 – operator<< : Sends contents of a SparseVector to a std::ostream object. ∗ Creates the text representation of a SparseVector and sends it to a std::ostream object. (See Text Representations section for more details) – function dot : Calculates the dot product(inner product) of two SparseVectors ∗ Returns a real number (See Dot Product Section for more details) SparseMatrix Class • Represents a two dimensional sparse data. • Requirements: – SparseMatrix : Constructors. ∗ Similar to SparsVector class description. – operator+ : Adds two matrices ∗ Similar to SparsVector class description. – operator- : Subtracts one matrix from another 1 ∗ Similar to SparsVector class description. – operator- : Negates elements of a matrix ∗ Similar to SparsVector class description. – operator= : Assigns one matrix to another ∗ Similar to SparsVector class description. – operator<< : Sends contents of a SparseMatrix to a std::ostream object. ∗ Similar to SparsVector class description. – operator* : Multiplies two matrices (Regular matrix multiplication) ∗ Similar to SparsVector class description. – function transpose : Returns the transpose of a matrix ∗ Creates another SparseMatrix which is the transpose of the original object. Driver Program • This part describes how you test various operations for the classes you created. • Your classes will be tested by a driver program. The driver program perform various SparseVector and SparseMatrix operations and incrementally fill a file with the changing contents of the objects created • Below is an example driver program.(Not all operations are shown) #include #include #include #include "SparseVector.h" #include "SparseMatrix.h" using namespace std; int main() { ofstream outfile; outfile.open("output.txt", ios::out | ios::trunc ); //Creating a SparseVector from file SparseVector a1("a1.txt"); outfile<<"a1"<<endl<<a1<<endl; //Binary operations and assignment a1 = a1 + a1; outfile<<"a1"<<endl<<a1<<endl; //Creating SparseMatrix from file SparseMatrix m1("m1.txt"); SparseMatrix m2("m2.txt"); outfile<<"m2"<<endl<<m2<<endl; //Transpose outfile<<m2.transpose()<<endl; //Dot product outfile<<dot(a1,a1)<<endl; return 0; } 2 Text Representations Text Representation of SparseVector • format: : : :... • index is in ascending order (natural number) • example: 4:23.8 7:10.7 10:34 12:20 1012:5 • For the above example non-zero indices are 4,7,10,12,1012 Text Representation of SparseMatrix • format: : : :... : : :... : : :... . . . • index and row_index are in ascending order (natural numbers) • example: 3 3:24.6 4:5.5 4 1:1.15 8 5:6.4 8:34.1 9:13.1 Dot Product • Dot product of two vectors is a scalar operation • Dot product of vector_1 and vector_2: dot_product = vector_1[0]*vector_2[0] + vector_1[1]*vector_2[1] + vector_1[2]*vector_2[2] + ... Transpose • Matrix: : : :... : : :... : : :... . . . • Transpose of the Matrix : : :... : : :... : : :... . . . 3 File I/O File I/O objects are defined in header. In order to write to a file, first wee need to create the file stream object. A file stream object is similar to std::cout. For output, It is type is std::ofstream. This type is derived from std::ostream. //create the file stream object ofstream couttofile; //open the file and associate it with the object couttofile.open("output.txt", ios::out | ios::trunc ); //write to stream object couttofile<<"Test"<<endl; couttofile<<"Test2"<<endl; . . . In order to write to a file, first wee need to create the file stream object. A file stream object is similar to std::cin. For input, It is type is std::ifstream. This type is derived from std::istream. //create the file stream object ifstream cinfromfile; //open the file and associate it with the object cinfromfile.open("input.txt"); //read "12:23.5" from stream object int a; double b; char c; cinfromfileacb; //in order to read the a line from a file, you can use getline() // function from library. string s; std::getline(cinfromfile, s); //reading lines in a loop //a helper function in order to secure file read operations int check_errors(ifstream* f) { int stop = 0; if (f-eof()) { // EOF after std::getline() is not the criterion to stop processing // data: In case there is data between the last delimiter and EOF, // getline() extracts it and sets the eofbit. stop = 0; } if (f-fail()) { stop = 1; } if (f-bad()) { stop = 1; } return stop; } 4 //Create a string string line; //Create an ifstream object by providing a filename // This opens the file as well ifstream f ("file.txt"); //check if it is open if (f.is_open()) { while(1) { getline(f, line); if (check_errors(&f)) { //skip the data processing and break break; } // This is the actual operation on the data obtained and we want to // protect it from errors during the last IO operation on the stream cout << "data line " << ": " << line << endl; } } Remarks • Write comments in your code. • If your code does not compile you will get 0 • Do not share your code with your classmates. Turn in: • “SparseVector.h” • “SparseMatrix.h” • .cpp implementations of classes and everything else you created. • Your code will be compiled according to the following GNU make script • You can also provide your own makefile script • Do not send any IDE specific files. SRC_DIR := . OBJ_DIR := . SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp) OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) LDFLAGS := ... CPPFLAGS := ... CXXFLAGS := ... main.out: $(OBJ_FILES) g++ $(LDFLAGS) -o $@ $^ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp g++ $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< CPPFLAGS += -std=c++11 CXXFLAGS += -MMD -include $(OBJ_FILES:.o=.d) 5 Late Submission • (0,24] hours: -20% • (24,48] hours: -40% • (48,72] hours: -60% • (72,-) hours: -100% 6

More products