00001
00029 #ifndef ELEM_MATH_H
00030 #define ELEM_MATH_H
00031
00032 #include <itpp/base/itcompat.h>
00033 #include <itpp/base/help_functions.h>
00034 #include <itpp/base/converters.h>
00035 #include <cstdlib>
00036
00037
00038 namespace itpp
00039 {
00040
00043
00044
00045
00047 inline double sqr(double x) { return (x * x); }
00049 inline double sqr(const std::complex<double>& x)
00050 {
00051 return (x.real() * x.real() + x.imag() * x.imag());
00052 }
00054 inline vec sqr(const vec &x) { return apply_function<double>(sqr, x); }
00056 inline mat sqr(const mat &x) { return apply_function<double>(sqr, x); }
00058 vec sqr(const cvec &x);
00060 mat sqr(const cmat &x);
00061
00062
00063
00064
00066 inline vec abs(const vec &x) { return apply_function<double>(std::fabs, x); }
00068 inline mat abs(const mat &x) { return apply_function<double>(std::fabs, x); }
00070 inline ivec abs(const ivec &x) { return apply_function<int>(std::abs, x); }
00072 inline imat abs(const imat &x) { return apply_function<int>(std::abs, x); }
00074 vec abs(const cvec &x);
00076 mat abs(const cmat &x);
00077
00078
00079
00080
00082 inline double sign(double x)
00083 {
00084 return (x == 0.0 ? 0.0 : (x < 0.0 ? -1.0 : 1.0));
00085 }
00087 inline vec sign(const vec &x) { return apply_function<double>(sign, x); }
00089 inline mat sign(const mat &x) { return apply_function<double>(sign, x); }
00090
00092 inline double sgn(double x) { return sign(x); }
00094 inline vec sgn(const vec &x) { return apply_function<double>(sign, x); }
00096 inline mat sgn(const mat &x) { return apply_function<double>(sign, x); }
00097
00099 inline int sign_i(int x)
00100 {
00101 return (x == 0 ? 0 : (x < 0 ? -1 : 1));
00102 }
00104 inline ivec sign_i(const ivec &x) { return apply_function<int>(sign_i, x); }
00106 inline imat sign_i(const imat &x) { return apply_function<int>(sign_i, x); }
00107
00109 inline int sgn_i(int x) { return sign_i(x); }
00111 inline ivec sgn_i(const ivec &x) { return apply_function<int>(sign_i, x); }
00113 inline imat sgn_i(const imat &x) { return apply_function<int>(sign_i, x); }
00114
00116 inline int sign_i(double x)
00117 {
00118 return (x == 0.0 ? 0 : (x < 0.0 ? -1 : 1));
00119 }
00120
00121
00122
00124 inline vec sqrt(const vec &x) { return apply_function<double>(std::sqrt, x); }
00126 inline mat sqrt(const mat &x) { return apply_function<double>(std::sqrt, x); }
00127
00128
00129
00130
00132 inline double gamma(double x) { return tgamma(x); }
00134 inline vec gamma(const vec &x) { return apply_function<double>(tgamma, x); }
00136 inline mat gamma(const mat &x) { return apply_function<double>(tgamma, x); }
00137
00138
00139
00140
00142 inline double rem(double x, double y) { return fmod(x, y); }
00144 inline vec rem(const vec &x, double y)
00145 {
00146 return apply_function<double>(rem, x, y);
00147 }
00149 inline vec rem(double x, const vec &y)
00150 {
00151 return apply_function<double>(rem, x, y);
00152 }
00154 inline mat rem(const mat &x, double y)
00155 {
00156 return apply_function<double>(rem, x, y);
00157 }
00159 inline mat rem(double x, const mat &y)
00160 {
00161 return apply_function<double>(rem, x, y);
00162 }
00163
00164
00165
00167 inline int mod(int k, int n)
00168 {
00169 return (n == 0) ? k : (k - n * floor_i(static_cast<double>(k) / n));
00170 }
00171
00172
00173
00174
00176 double fact(int index);
00177
00178
00179
00180
00182 double binom(int n, int k);
00183
00185 int binom_i(int n, int k);
00186
00188 double log_binom(int n, int k);
00189
00190
00191
00192
00200 int gcd(int a, int b);
00201
00202
00203
00204
00206 vec real(const cvec &x);
00208 mat real(const cmat &x);
00210 vec imag(const cvec &x);
00212 mat imag(const cmat &x);
00213
00215 vec arg(const cvec &x);
00217 mat arg(const cmat &x);
00219 inline vec angle(const cvec &x) { return arg(x); }
00221 inline mat angle(const cmat &x) { return arg(x); }
00222
00223
00224
00225 #ifndef _MSC_VER
00227 inline cvec conj(const cvec &x)
00228 {
00229 return apply_function<std::complex<double> >(std::conj, x);
00230 }
00232 inline cmat conj(const cmat &x)
00233 {
00234 return apply_function<std::complex<double> >(std::conj, x);
00235 }
00236 #else
00238 cvec conj(const cvec &x);
00239
00241 cmat conj(const cmat &x);
00242 #endif
00243
00245
00246 }
00247
00248 #endif // #ifndef ELEM_MATH_H
00249
00250
00251
00252