My omnium-gatherom of scripts and source code.
at main 149 lines 3.0 kB view raw
1/* ======================================================================== 2 * 3 * Filename: main.cpp 4 * Description: matrix algorithms 5 * Author: Diego A. Estrada Rivera 6 * Version: 0.0.1 7 * 8 * ======================================================================== */ 9 10#include <iostream> 11auto println(auto x){ 12 std::cout << x << std::endl; 13} 14auto print(auto x){ 15 std::cout << x; 16} 17 18#include <bits/stdc++.h> 19#define int uint64_t 20#define var auto 21#define fn auto 22#define let auto const 23using namespace std; 24typedef size_t sz; 25typedef vector<int> vi; 26typedef pair<int, int> ii; 27typedef vector<pair<int, int>> vii; 28typedef vector<vector<int>> vvi; 29template <typename T> 30using vec = std::vector<T>; 31 32template<typename T> 33struct Matrix{ 34 Matrix(sz r,sz c):data(vec<T>(r*c)),cols(c),rows(r){} 35 36 fn operator[](sz i)->T&{ 37 return data[i]; 38 } 39 40 fn operator[](sz r, sz c)->T&{ 41 return data[r*cols+c]; 42 } 43 44 fn get_row(sz r)->vec<T>{ 45 var ret=vec<T>(cols); 46 sz i=0; 47 for(var&e:ret)e=data[rows*r+i],++i; 48 return ret; 49 } 50 51 fn get_col(sz c)->vec<T>{ 52 var ret=vec<T>(rows); 53 sz i=0; 54 for(var&e:ret)e=data[cols*i+c],++i; 55 return ret; 56 } 57 58 void print(){ 59 for(sz r=0;r<rows;++r) { 60 for(sz c=0;c<cols;++c) 61 cout<<data[r*cols+c]<<' '; 62 cout << '\n'; 63 } 64 } 65 66 fn operator * (Matrix const& rhs) const noexcept -> Matrix; 67// fn operator*(Matrix const&rhs)->Matrix{ 68// var out=Matrix(rhs.rows, cols); 69// for(sz i=0;i<cols;++i){ 70// var r=get_row(i); 71// for(sz j=0; j<rhs.rows;++j){ 72// var c=rhs.get_col(j); 73// var sum=inner_product(r.begin(),r.end(),c.begin(),0); 74// out[i,j]=sum; 75// } 76// } 77// return out; 78// } 79 80 fn operator *= (Matrix const& rhs) noexcept -> Matrix&; 81// void operator*=(Matrix const&rhs){ 82// for(sz i=0;i<cols;++i){ 83// var sr=get_row(i); 84// for(sz j=0;j<rhs.rows;++j){ 85// var sc=rhs.get_col(j); 86// var sum=inner_product(sr.begin(),sr.end(),sc.begin(),0); 87// (*this)[i,j]=sum; 88// } 89// } 90// } 91 92 vec<T>data; 93 sz cols; 94 sz rows; 95}; 96 97template <typename T> 98fn Matrix<T>::operator * (Matrix<T> const& rhs) const noexcept -> Matrix { 99 let lhs = *this; 100 var out = lhs; 101 out *= rhs; 102 return out; 103 out = Matrix(rhs.rows, lhs.rows); 104 for (sz i = 0; i < lhs.cols; ++i) { 105 var r = lhs.get_row(i); 106 for (sz j = 0; j < rhs.rows; ++j) { 107 var c = rhs.get_col(j); 108 var sum = inner_product(r.cbegin(), r.cend(), c.cbegin(), 0); 109 lhs[i, j] = sum; 110 } 111 } 112 return out; 113}; 114 115template <typename T> 116fn Matrix<T>::operator *= (Matrix<T> const& rhs) noexcept -> Matrix& { 117 var lhs = *this; 118 for (sz i = 0; i < lhs.cols; ++i) { 119 var r = rhs.get_row(i); 120 for (sz j = 0; j < rhs.rows; ++j) { 121 var c = rhs.get_col(j); 122 var sum = inner_product(r.cbegin(), r.cend(), c.cbegin(), 0); 123 lhs[i, j] = sum; 124 } 125 } 126 return lhs; 127} 128 129auto main() -> int32_t 130{ 131 auto m = Matrix(2, 2); 132 m(0, 0) = 1; 133 m(0, 1) = 1; 134 m(1, 0) = 1; 135 auto l = Matrix(2, 1); 136 l(0, 0) = 0; 137 l(1, 0) = 1; 138 m.print(); 139 cout << endl; 140 auto n = 10; 141 while (n--) { 142 m = m * m; 143 m.print(); 144 } 145 146 m.print(); 147 148 return 0; 149}