diff --git a/src/sheet07.cpp b/src/sheet07.cpp index 82db29c..f8b3885 100644 --- a/src/sheet07.cpp +++ b/src/sheet07.cpp @@ -1,40 +1,55 @@ #include -#include +#include #include #include -#include -#include -#include +#include +#include +#include +#include +#include template +typename std::enable_if::value, &operator*> class matrix { public: matrix(size_t rows, size_t columns) : rows(rows), columns(columns) { - data(); + data = std::vector(rows*columns); } + matrix(size_t rows, size_t columns, const T &ival) : rows(rows), columns(columns) { data = std::vector(rows*columns, ival); } + matrix(std::initializer_list> imat) { + size_t column_num = 0; + size_t row_num = 0; size_t prev_length; + bool isNotFirst = false; for(std::initializer_list row : imat) { - if(prev_length!=row.size()) + if(isNotFirst&&prev_length!=row.size()) { - throw std::domain_error("provided initializer list with empty spots."); + throw std::domain_error("provided initializer list with empty elements."); } + ++row_num; prev_length = row.size(); + for(T t : row) { + if(!isNotFirst) { ++column_num; } data.push_back(t); } + isNotFirst = true; } + + this->rows = row_num; + this->columns = column_num; } T& operator() (size_t row, size_t column) { @@ -67,8 +82,51 @@ class matrix size_t num_rows() const noexcept { return rows; } size_t num_columns() const noexcept { return columns; } + std::vector column_to_vec(size_t column) const + { + std::vector out(this->num_rows()); + + for(size_t i=0; inum_rows();++i) + { + out.push_back((*this)(i,column)); + } + return out; + } + + std::vector row_to_vec(size_t row) const + { + std::vector out(this->num_columns()); + + for(size_t i=0; inum_columns();++i) + { + out.push_back((*this)(row,i)); + } + return out; + } + + static T dot_product(std::vector lhs, std::vector rhs) + { + if(lhs.size()!=rhs.size()) + { + throw std::domain_error("vectors must be the same size"); + } + + T sum = 0; + + for(size_t i=0; i()) + { + throw std::domain_error("type must be arithmetic."); + } + matrix out(lhs.num_rows(), lhs.num_columns(), 0); for(size_t x=0; x::value> + friend matrix operator* (const matrix &lhs, const matrix &rhs) = delete; + friend matrix operator* (const matrix &lhs, const matrix &rhs) { - //TODO - throw std::logic_error("unimplemented"); + if(!std::is_arithmetic()) + { + throw std::domain_error("type must be arithmetic."); + } + + if(lhs.num_columns()!=rhs.num_rws(rows), columns(columns) + { + for(size_t y=0; y m(5,5,5); - std::cout << m; - std::cout << m*5; - std::cout << m*m; + // // TODO comment-in the following code as needed to test your implementation + // // above. + matrix a(3, 3, 3); + a = a * 2; + matrix b(3, 3, 4); + auto start = std::chrono::steady_clock::now(); + matrix c = a * b; + auto end = std::chrono::steady_clock::now(); + auto duration = + std::chrono::duration_cast(end - start).count(); + std::cout << "multiplied a:\n"; + std::cout << a << '\n'; + std::cout << "with b:\n"; + std::cout << b << '\n'; + std::cout << "in " << duration << "ns\n"; + std::cout << "result is:\n"; + std::cout << c << '\n'; + + matrix d = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; + matrix e = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}}; + start = std::chrono::steady_clock::now(); + matrix f = d * e; + end = std::chrono::steady_clock::now(); + duration = + std::chrono::duration_cast(end - start).count(); + std::cout << "multiplied d:\n"; + std::cout << d << '\n'; + std::cout << "with e:\n"; + std::cout << e << '\n'; + std::cout << "in " << duration << "ns\n"; + std::cout << "result is:\n"; + std::cout << f << '\n'; } \ No newline at end of file