00001
00002 #ifndef vnl_block_h_
00003 #define vnl_block_h_
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007
00008
00009
00010
00011 #include <vcl_compiler.h>
00012
00013 void vnl_block_raise_exception(char const *FILE, int LINE, char const *why);
00014
00015
00016 template <class T> inline
00017 T vnl_block_sum(T const x[], unsigned n)
00018 {
00019 if (n == 0)
00020 return T(0);
00021 else {
00022 T ans = x[0];
00023 for (unsigned i=1; i<n; ++i)
00024 ans += x[i];
00025 return ans;
00026 }
00027 }
00028
00029
00030 template <class T> inline
00031 T vnl_block_product(T const x[], unsigned n)
00032 {
00033 if (n == 0)
00034 return T(1);
00035 else {
00036 T ans = x[0];
00037 for (unsigned i=1; i<n; ++i)
00038 ans *= x[i];
00039 return ans;
00040 }
00041 }
00042
00043
00044 template <class T> inline
00045 T vnl_block_min_value(T const x[], unsigned n)
00046 {
00047 if (n == 0)
00048 vnl_block_raise_exception(__FILE__, __LINE__, "n is 0");
00049 T ans = x[0];
00050 for (unsigned i=1; i<n; ++i)
00051 if (ans > x[i])
00052 ans = x[i];
00053 return ans;
00054 }
00055
00056
00057 template <class T> inline
00058 T vnl_block_max_value(T const x[], unsigned n)
00059 {
00060 if (n == 0)
00061 vnl_block_raise_exception(__FILE__, __LINE__, "n is 0");
00062 T ans = x[0];
00063 for (unsigned i=1; i<n; ++i)
00064 if (ans < x[i])
00065 ans = x[i];
00066 return ans;
00067 }
00068
00069
00070 template <class T> inline
00071 void vnl_block_copy(T const x[], T y[], unsigned n)
00072 {
00073 for (unsigned i=0; i<n; ++i)
00074 y[i] = x[i];
00075 }
00076
00077
00078 template <class T> inline
00079 void vnl_block_reverse(T x[], unsigned n)
00080 {
00081 T tmp;
00082 for (unsigned i=0; 2*i<n; ++i) {
00083 tmp = x[i];
00084 x[i] = x[n-1-i];
00085 x[n-1-i] = tmp;
00086 }
00087 }
00088
00089
00090 template <class T> inline
00091 void vnl_block_scale(T a, T x[], unsigned n)
00092 {
00093 for (unsigned i=0; i<n; ++i)
00094 x[i] *= a;
00095 }
00096
00097
00098 template <class T> inline
00099 void vnl_block_scale(T a, T const x[], T y[], unsigned n)
00100 {
00101 for (unsigned i=0; i<n; ++i)
00102 y[i] = a * x[i];
00103 }
00104
00105
00106 template <class T> inline
00107 void vnl_block_add(T const x[], T y[], unsigned n)
00108 {
00109 for (unsigned i=0; i<n; ++i)
00110 y[i] += x[i];
00111 }
00112
00113
00114 template <class T> inline
00115 void vnl_block_add(T const x[], T const y[], T z[], unsigned n)
00116 {
00117 for (unsigned i=0; i<n; ++i)
00118 z[i] = x[i] + y[i];
00119 }
00120
00121
00122 template <class T> inline
00123 void vnl_block_sub(T const x[], T const y[], T z[], unsigned n)
00124 {
00125 for (unsigned i=0; i<n; ++i)
00126 z[i] = x[i] - y[i];
00127 }
00128
00129
00130 template <class T> inline
00131 void vnl_block_mul(T const x[], T y[], unsigned n)
00132 {
00133 for (unsigned i=0; i<n; ++i)
00134 y[i] *= x[i];
00135 }
00136
00137
00138 template <class T> inline
00139 void vnl_block_mul(T const x[], T const y[], T z[], unsigned n)
00140 {
00141 for (unsigned i=0; i<n; ++i)
00142 z[i] = x[i] * y[i];
00143 }
00144
00145
00146 template <class T> inline
00147 void vnl_block_div(T const x[], T const y[], T z[], unsigned n)
00148 {
00149 for (unsigned i=0; i<n; ++i)
00150 z[i] = x[i] / y[i];
00151 }
00152
00153
00154 template <class T> inline
00155 void vnl_block_negate(T const x[], T y[], unsigned n)
00156 {
00157 for (unsigned i=0; i<n; ++i)
00158 y[i] = - x[i];
00159 }
00160
00161
00162 template <class T> inline
00163 void vnl_block_invert(T const x[], T y[], unsigned n)
00164 {
00165 for (unsigned i=0; i<n; ++i)
00166 y[i] = T(1) / x[i];
00167 }
00168
00169
00170 template <class T> inline
00171 void vnl_block_axpy(T a, T const x[], T y[], unsigned n)
00172 {
00173 for (unsigned i=0; i<n; ++i)
00174 y[i] += a * x[i];
00175 }
00176
00177
00178 template <class T> inline
00179 void vnl_block_fill(T x[], unsigned n, T value)
00180 {
00181 for (unsigned i=0; i<n; ++i)
00182 x[i] = value;
00183 }
00184
00185 #endif // vnl_block_h_