|
1 #include <lemon/time_measure.h> |
|
2 #include <vector> |
|
3 |
|
4 template<class T> |
|
5 class Matrix |
|
6 { |
|
7 public: |
|
8 int m,n; |
|
9 std::vector<T> values; |
|
10 |
|
11 Matrix(int _m, int _n) : m(_m), n(_n), values(n*m) {} |
|
12 typename std::vector<T>::reference operator()(int i, int j) |
|
13 { return values[i*n+j];} |
|
14 |
|
15 class Row |
|
16 { |
|
17 public: |
|
18 Matrix<T> &mat; |
|
19 int row; |
|
20 |
|
21 Row(Matrix<T> &_mat,int _row) : mat(_mat), row(_row) {} |
|
22 typename std::vector<T>::reference operator()(int j) |
|
23 { return mat.values[row*mat.n+j];} |
|
24 }; |
|
25 class Column |
|
26 { |
|
27 public: |
|
28 Matrix<T> &mat; |
|
29 int col; |
|
30 |
|
31 Column(Matrix<T> &_mat,int _col) : mat(_mat), col(_col) {} |
|
32 typename std::vector<T>::reference operator[](int i) |
|
33 { return mat.values[i*mat.n+col];} |
|
34 }; |
|
35 |
|
36 Row operator[](int i) { return Row(*this,i); } |
|
37 Column operator()(int j) { return Column(*this,j); } |
|
38 }; |
|
39 |
|
40 main() |
|
41 { |
|
42 const int COUNT=1000000; |
|
43 const int SIZE=100; |
|
44 |
|
45 Matrix<int> A(SIZE,SIZE); |
|
46 |
|
47 for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) A(i,j)=i+j; |
|
48 |
|
49 int s=0; |
|
50 lemon::Timer T; |
|
51 for(int c=0;c<COUNT;c++) { |
|
52 for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A[i](j); |
|
53 } |
|
54 std::cout << "A[i](j): " << T << ' ' << s <<'\n'; |
|
55 s=0; |
|
56 T.reset(); |
|
57 for(int c=0;c<COUNT;c++) { |
|
58 for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(i,j); |
|
59 } |
|
60 std::cout << "A(i,j): " << T << ' ' << s << '\n'; |
|
61 s=0; |
|
62 T.reset(); |
|
63 for(int c=0;c<COUNT;c++) { |
|
64 for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(j)[i]; |
|
65 } |
|
66 std::cout << "A(j)[i]: " << T << ' ' << s << '\n'; |
|
67 s=0; |
|
68 T.reset(); |
|
69 for(int c=0;c<COUNT;c++) { |
|
70 for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(i,j); |
|
71 } |
|
72 std::cout << "A(j,i): " << T << ' ' << s << "\n\n"; |
|
73 |
|
74 return 0; |
|
75 } |