My omnium-gatherom of scripts and source code.
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}