core/vnl/vnl_block.h

Go to the documentation of this file.
00001 // This is core/vnl/vnl_block.h
00002 #ifndef vnl_block_h_
00003 #define vnl_block_h_
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007 //:
00008 // \file
00009 // \author fsm
00010 
00011 #include <vcl_compiler.h>
00012 
00013 void vnl_block_raise_exception(char const *FILE, int LINE, char const *why);
00014 
00015 //: return sum of elements
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 //: return product of elements
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 //: return smallest value.
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 //: return largest value.
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 //: y[i] = x[i]
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 //: reverses sequence
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 //: x[i] *= a
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 //: y[i] = a * x[i]
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 //: y[i] += x[i]
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 //: z[i] = x[i] + y[i]
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 //: z[i] = x[i] - y[i]
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 //: y[i] *= x[i]
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 //: z[i]  = x[i] * y[i]
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 //: z[i]  = x[i] / y[i]
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 //: y[i]  = -x[i]
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 //: y[i]  = 1/x[i]
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 //:  y[i] += a * x[i]
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 //: x[i]  = v
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_

Generated on Fri Nov 21 05:06:13 2008 for core/vnl by  doxygen 1.5.1