/* ======================================================================== * * Filename: main.cpp * Description: matrix algorithms * Author: Diego A. Estrada Rivera * Version: 0.0.1 * * ======================================================================== */ #include auto println(auto x){ std::cout << x << std::endl; } auto print(auto x){ std::cout << x; } #include #define int uint64_t #define var auto #define fn auto #define let auto const using namespace std; typedef size_t sz; typedef vector vi; typedef pair ii; typedef vector> vii; typedef vector> vvi; template using vec = std::vector; template struct Matrix{ Matrix(sz r,sz c):data(vec(r*c)),cols(c),rows(r){} fn operator[](sz i)->T&{ return data[i]; } fn operator[](sz r, sz c)->T&{ return data[r*cols+c]; } fn get_row(sz r)->vec{ var ret=vec(cols); sz i=0; for(var&e:ret)e=data[rows*r+i],++i; return ret; } fn get_col(sz c)->vec{ var ret=vec(rows); sz i=0; for(var&e:ret)e=data[cols*i+c],++i; return ret; } void print(){ for(sz r=0;r Matrix; // fn operator*(Matrix const&rhs)->Matrix{ // var out=Matrix(rhs.rows, cols); // for(sz i=0;i Matrix&; // void operator*=(Matrix const&rhs){ // for(sz i=0;idata; sz cols; sz rows; }; template fn Matrix::operator * (Matrix const& rhs) const noexcept -> Matrix { let lhs = *this; var out = lhs; out *= rhs; return out; out = Matrix(rhs.rows, lhs.rows); for (sz i = 0; i < lhs.cols; ++i) { var r = lhs.get_row(i); for (sz j = 0; j < rhs.rows; ++j) { var c = rhs.get_col(j); var sum = inner_product(r.cbegin(), r.cend(), c.cbegin(), 0); lhs[i, j] = sum; } } return out; }; template fn Matrix::operator *= (Matrix const& rhs) noexcept -> Matrix& { var lhs = *this; for (sz i = 0; i < lhs.cols; ++i) { var r = rhs.get_row(i); for (sz j = 0; j < rhs.rows; ++j) { var c = rhs.get_col(j); var sum = inner_product(r.cbegin(), r.cend(), c.cbegin(), 0); lhs[i, j] = sum; } } return lhs; } auto main() -> int32_t { auto m = Matrix(2, 2); m(0, 0) = 1; m(0, 1) = 1; m(1, 0) = 1; auto l = Matrix(2, 1); l(0, 0) = 0; l(1, 0) = 1; m.print(); cout << endl; auto n = 10; while (n--) { m = m * m; m.print(); } m.print(); return 0; }