alpar@994: #include <lemon/time_measure.h> alpar@994: #include <vector> alpar@994: alpar@994: template<class T> alpar@994: class Matrix alpar@994: { alpar@994: public: alpar@994: int m,n; alpar@994: std::vector<T> values; alpar@994: alpar@994: Matrix(int _m, int _n) : m(_m), n(_n), values(n*m) {} alpar@994: typename std::vector<T>::reference operator()(int i, int j) alpar@994: { return values[i*n+j];} alpar@994: alpar@994: class Row alpar@994: { alpar@994: public: alpar@994: Matrix<T> &mat; alpar@994: int row; alpar@994: alpar@994: Row(Matrix<T> &_mat,int _row) : mat(_mat), row(_row) {} alpar@994: typename std::vector<T>::reference operator()(int j) alpar@994: { return mat.values[row*mat.n+j];} alpar@994: }; alpar@994: class Column alpar@994: { alpar@994: public: alpar@994: Matrix<T> &mat; alpar@994: int col; alpar@994: alpar@994: Column(Matrix<T> &_mat,int _col) : mat(_mat), col(_col) {} alpar@994: typename std::vector<T>::reference operator[](int i) alpar@994: { return mat.values[i*mat.n+col];} alpar@994: }; alpar@994: alpar@994: Row operator[](int i) { return Row(*this,i); } alpar@994: Column operator()(int j) { return Column(*this,j); } alpar@994: }; alpar@994: alpar@994: main() alpar@994: { alpar@994: const int COUNT=1000000; alpar@994: const int SIZE=100; alpar@994: alpar@994: Matrix<int> A(SIZE,SIZE); alpar@994: alpar@994: for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) A(i,j)=i+j; alpar@994: alpar@994: int s=0; alpar@994: lemon::Timer T; alpar@994: for(int c=0;c<COUNT;c++) { alpar@994: for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A[i](j); alpar@994: } alpar@994: std::cout << "A[i](j): " << T << ' ' << s <<'\n'; alpar@994: s=0; alpar@994: T.reset(); alpar@994: for(int c=0;c<COUNT;c++) { alpar@994: for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(i,j); alpar@994: } alpar@994: std::cout << "A(i,j): " << T << ' ' << s << '\n'; alpar@994: s=0; alpar@994: T.reset(); alpar@994: for(int c=0;c<COUNT;c++) { alpar@994: for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(j)[i]; alpar@994: } alpar@994: std::cout << "A(j)[i]: " << T << ' ' << s << '\n'; alpar@994: s=0; alpar@994: T.reset(); alpar@994: for(int c=0;c<COUNT;c++) { alpar@994: for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(i,j); alpar@994: } alpar@994: std::cout << "A(j,i): " << T << ' ' << s << "\n\n"; alpar@994: alpar@994: return 0; alpar@994: }