00001 00030 #ifndef MIN_MAX_H 00031 #define MIN_MAX_H 00032 00033 #include <itpp/base/mat.h> 00034 00035 00036 namespace itpp { 00037 00043 00044 template<class T> 00045 T max(const Vec<T> &v) 00046 { 00047 T maxdata = v(0); 00048 for (int i = 1; i < v.length(); i++) 00049 if (v(i) > maxdata) 00050 maxdata = v(i); 00051 return maxdata; 00052 } 00053 00055 template<class T> 00056 T max(const Vec<T> &v, int& index) 00057 { 00058 T maxdata = v(0); 00059 index = 0; 00060 for (int i = 1; i < v.length(); i++) 00061 if (v(i) > maxdata) { 00062 maxdata = v(i); 00063 index = i; 00064 } 00065 return maxdata; 00066 } 00067 00075 template<class T> 00076 Vec<T> max(const Mat<T> &m, int dim = 1) 00077 { 00078 it_assert((dim == 1) || (dim == 2), "max(): dimension need to be 1 or 2"); 00079 Vec<T> out; 00080 if (dim == 1) { 00081 out.set_size(m.cols(), false); 00082 for (int i = 0; i < m.cols(); i++) 00083 out(i) = max(m.get_col(i)); 00084 } 00085 else { 00086 out.set_size(m.rows(), false); 00087 for (int i = 0; i < m.rows(); i++) 00088 out(i) = max(m.get_row(i)); 00089 } 00090 return out; 00091 } 00092 00103 template<class T> 00104 Vec<T> max(const Mat<T> &m, ivec &index, int dim = 1) 00105 { 00106 it_assert((dim == 1) || (dim == 2), "max(): dimension need to be 1 or 2"); 00107 Vec<T> out; 00108 if (dim == 1) { 00109 out.set_size(m.cols(), false); 00110 index.set_size(m.cols(), false); 00111 for (int i = 0; i < m.cols(); i++) 00112 out(i) = max(m.get_col(i), index(i)); 00113 } 00114 else { 00115 out.set_size(m.rows(), false); 00116 index.set_size(m.rows(), false); 00117 for (int i = 0; i < m.rows(); i++) 00118 out(i) = max(m.get_row(i), index(i)); 00119 } 00120 return out; 00121 } 00122 00124 template<class T> 00125 T min(const Vec<T> &in) 00126 { 00127 T mindata = in[0]; 00128 for (int i = 1; i < in.length(); i++) 00129 if (in[i] < mindata) 00130 mindata = in[i]; 00131 return mindata; 00132 } 00133 00135 template<class T> 00136 T min(const Vec<T> &in, int& index) 00137 { 00138 T mindata = in[0]; 00139 index = 0; 00140 for (int i = 1; i < in.length(); i++) 00141 if (in[i] < mindata) { 00142 mindata = in[i]; 00143 index = i; 00144 } 00145 return mindata; 00146 } 00147 00148 00156 template<class T> 00157 Vec<T> min(const Mat<T> &m, int dim=1) 00158 { 00159 it_assert((dim == 1) || (dim == 2), "min(): dimension need to be 1 or 2"); 00160 Vec<T> out; 00161 if (dim == 1) { 00162 out.set_size(m.cols(), false); 00163 for (int i = 0; i < m.cols(); i++) 00164 out(i) = min(m.get_col(i)); 00165 } 00166 else { 00167 out.set_size(m.rows(), false); 00168 for (int i = 0; i < m.rows(); i++) 00169 out(i) = min(m.get_row(i)); 00170 } 00171 return out; 00172 } 00173 00174 00185 template<class T> 00186 Vec<T> min(const Mat<T> &m, ivec &index, int dim=1) 00187 { 00188 it_assert((dim == 1) || (dim == 2), "min(): dimension need to be 1 or 2"); 00189 Vec<T> out; 00190 if (dim == 1) { 00191 out.set_size(m.cols(), false); 00192 index.set_size(m.cols(), false); 00193 for (int i = 0; i < m.cols(); i++) 00194 out(i) = min(m.get_col(i), index(i)); 00195 } 00196 else { 00197 out.set_size(m.rows(), false); 00198 index.set_size(m.rows(), false); 00199 for (int i = 0; i < m.rows(); i++) 00200 out(i) = min(m.get_row(i), index(i)); 00201 } 00202 return out; 00203 } 00204 00205 00207 template<class T> 00208 int max_index(const Vec<T> &in) 00209 { 00210 int maxindex = 0; 00211 for (int i = 1; i < in.length(); i++) 00212 if (in[i] > in[maxindex]) 00213 maxindex = i; 00214 return maxindex; 00215 } 00216 00218 template<class T> 00219 void max_index(const Mat<T> &m, int &row, int &col) 00220 { 00221 T maxdata = m(0, 0); 00222 row = col = 0; 00223 for (int i = 0; i < m.rows(); i++) 00224 for (int j = 0; j < m.cols(); j++) 00225 if (m(i, j) > maxdata) { 00226 row = i; 00227 col = j; 00228 maxdata = m(i, j); 00229 } 00230 } 00231 00233 template<class T> 00234 int min_index(const Vec<T> &in) 00235 { 00236 int minindex = 0; 00237 for (int i = 1; i < in.length(); i++) 00238 if (in[i] < in[minindex]) 00239 minindex = i; 00240 return minindex; 00241 } 00242 00244 template<class T> 00245 void min_index(const Mat<T> &m, int &row, int &col) 00246 { 00247 T mindata = m(0, 0); 00248 row = col = 0; 00249 for (int i = 0; i < m.rows(); i++) 00250 for (int j = 0; j < m.cols(); j++) 00251 if (m(i, j) < mindata) { 00252 row = i; 00253 col = j; 00254 mindata = m(i, j); 00255 } 00256 } 00257 00262 } //namespace itpp 00263 00264 00265 #endif /* MIN_MAX_H */
Generated on Sat Apr 19 10:42:05 2008 for IT++ by Doxygen 1.5.5