00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef _GenMatrix_h_
00032 #define _GenMatrix_h_
00033
00034 #include <iostream>
00035
00036
00037
00038 #ifdef ARRAY_CHECK
00039 static void myMessage(int i, int j) {
00040 std::cout << "Matrix out of range: (" << i << "," << j << ")" << std::endl;
00041 std::cout << " press [return]" << std::endl;
00042 getchar();
00043 }
00044 #endif
00045
00046
00056
00057
00058 template <class Type>
00059 class GenMatrix {
00060 Type** arr_;
00061 int noX_, noY_;
00062 int rX_, rY_;
00063 public:
00064 GenMatrix() {arr_ = NULL; noX_ = noY_ = rX_ = rY_ = 0;}
00065 GenMatrix(int noX, int noY)
00066 {noX_ = noY_ = rX_ = rY_ = 0; arr_ = NULL; resize(noX, noY);}
00067 ~GenMatrix() {clear();}
00068
00069
00070 GenMatrix(const GenMatrix& G) {
00071
00072
00073 std::cout << "GenMatrix:: copy constructor not implemented, use init()" << std::endl;
00074 std::cout << "EXIT FROM GenMatrix:: copy constructor" << std::endl;
00075
00076 exit(-1);
00077 }
00078
00079
00080 void init(const GenMatrix& G) {
00081 clear();
00082 reserve(G.rX_,G.rY_);
00083 resize(G.noX_,G.noY_);
00084 for (int j = 0; j < noY_; j++) {
00085 for (int i = 0; i < noX_; i++) {
00086 arr_[j][i] = G.arr_[j][i];
00087 }
00088 }
00089 }
00090
00091
00092 void swap(GenMatrix& mat) {
00093 std::swap(arr_, mat.arr_);
00094
00095 std::swap(noX_, mat.noX_);
00096 std::swap(noY_, mat.noY_);
00097 std::swap(rX_ , mat.rX_);
00098 std::swap(rY_ , mat.rY_);
00099 }
00100
00101 void operator += (GenMatrix& mat) {
00102 for (int j = 0; j < noY_; j++) {
00103 for (int i = 0; i < noX_; i++) {
00104 arr_[j][i] += mat.arr_[j][i];
00105 }
00106 }
00107 }
00108
00109 Type norm_2() const
00110 {
00111 Type temp;
00112 Type res = 0;
00113 for (int j = 0; j < noY_; ++j) {
00114 for (int i = 0; i < noX_; ++i) {
00115 temp = arr_[j][i];
00116 res = temp*temp;
00117 }
00118 }
00119 return temp;
00120 }
00121
00122
00123
00124 void operator += (double offset) {
00125 for (int j = 0; j < noY_; j++) {
00126 for (int i = 0; i < noX_; i++) {
00127 arr_[j][i] += offset;
00128 }
00129 }
00130 }
00131
00132
00133 void resize(int noX, int noY) {
00134 if (noX > rX_ || noY > rY_) {
00135 clear();
00136 rX_ = noX; rY_ = noY;
00137 arr_ = new Type*[rY_];
00138 for (int j = 0; j < rY_; j++)
00139 arr_[j] = new Type[rX_];
00140 }
00141 noX_ = noX; noY_ = noY;
00142 }
00143
00144 void reserve(int rX, int rY) {resize(rX, rY); noX_ = 0; noY_ = 0;}
00145
00146 void clear() {
00147 if (arr_) {
00148 for (int j = 0; j < rY_; j++)
00149 delete [] arr_[j];
00150 delete [] arr_;
00151 arr_ = NULL;
00152 }
00153 rX_ = rY_ = noX_ = noY_ = 0;
00154 }
00155
00156 inline int noX() const {return noX_;}
00157 inline int noY() const {return noY_;}
00158 void capacity(int& rX, int& rY) const {rX = rX_; rY = rY_;}
00159
00160 inline const Type& operator()(int ii, int jj) const {
00161
00162 #ifdef ARRAY_CHECK
00163 int i = ii+1;
00164 int j = jj+1;
00165 if (i < 0 || i >= noX_ || j < 0 || j >= noY_)
00166 myMessage(ii,jj);
00167 #endif
00168 return arr_[jj+1][ii+1];
00169 }
00170
00171 inline Type& operator()(int ii, int jj) {
00172
00173 #ifdef ARRAY_CHECK
00174 int i = ii+1;
00175 int j = jj+1;
00176 if (i < 0 || i >= noX_ || j < 0 || j >= noY_)
00177 myMessage(ii,jj);
00178 #endif
00179 return arr_[jj+1][ii+1];
00180 }
00181
00182
00183 void fill(Type val) {
00184 for (int j = 0; j < noY_; j++)
00185 for (int i = 0; i < noX_; i++)
00186 arr_[j][i] = val;
00187 }
00188
00189
00190 void print() const {
00191 std::cout << "Matrix..." << std::endl;
00192 for (int j = 0; j < noY_; j++) {
00193 for (int i = 0; i < noX_; i++) {
00194 std::cout << arr_[j][i] << " ";
00195 }
00196 std::cout << std::endl;
00197 }
00198 }
00199
00200
00201 void printBitmap() const {
00202
00203 for (int j = 0; j < noY_; j++) {
00204 for (int i = 0; i < noX_; i++) {
00205 if (arr_[j][i] == 0)
00206 std::cout << 0;
00207 else
00208 std::cout << 1;
00209 }
00210 std::cout << std::endl;
00211 }
00212 }
00213 };
00214
00215 #endif