00001
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "CTBtraits.hxx"
00015 #include "CTBnum.hxx"
00016 #include "CTBexceptionIndexRange.hxx"
00017 #include "CTBexceptionConformity.hxx"
00018
00019
00028 template <class T>
00029 inline T CTBdot(const CTBvector<T>& v1, const CTBvector<T>& v2)
00030 {
00031 const T* p_v1 = v1;
00032 const T* p_v2 = v2;
00033 CTBtraits<T>::Sum_t f_sum = 0.;
00034
00035 #ifdef CTB__ConformityCheck
00036 CTBint n = v1.Size();
00037 if (n != v2.Size())
00038 throw CTBexceptionConformity(n, v2.Size(),
00039 "CTBdot(CTBvector&,CTBvector&)");
00040 #else
00041 CTBint n = CTBmin(v1.Size(), v2.Size());
00042 #endif
00043
00044 for (CTBint i = 0; i < n; i++) f_sum += *p_v1++ * *p_v2++;
00045 return f_sum;
00046 }
00047
00048
00057 template <class T>
00058 inline T CTBdot(const CTBvector<T>& v1, const CTBvector<T>& v2,
00059 CTBint i_beg, CTBint i_end)
00060 {
00061 const T* p_v1 = &v1(i_beg);
00062 const T* p_v2 = &v2(i_beg);
00063 CTBtraits<T>::Sum_t f_sum = 0.;
00064
00065 #ifdef CTB__IndexCheck
00066 CTBint n = CTBmin(v1.Size(), v2.Size());
00067 if (i_end >= i_beg && (i_end < 0 || i_end >= n))
00068 throw CTBexceptionIndexRange(i_end,n,
00069 "CTBdot(CTBvector&,CTBvector&,CTBint,CTBint)");
00070 #endif
00071
00072 for (CTBint i = i_beg; i <= i_end; i++) f_sum += *p_v1++ * *p_v2++;
00073 return f_sum;
00074 }
00075
00076
00087 template <class T>
00088 inline T CTBdot(const CTBmatrix<T>& m, CTBint i_row, const CTBvector<T>& v)
00089 {
00090 const T* p_m = &m(i_row,0);
00091 const T* p_v = v;
00092 CTBtraits<T>::Sum_t f_sum = 0.;
00093
00094 #ifdef CTB__ConformityCheck
00095 CTBint n = m.NColumn();
00096 if (n != v.Size())
00097 throw CTBexceptionConformity(n, v.Size(),
00098 "CTBdot(CTBmatrix&,CTBint,CTBvector&)");
00099 #else
00100 CTBint n = CTBmin(m.NColumn(), v.Size());
00101 #endif
00102
00103 for (CTBint i = 0; i < n; i++) f_sum += *p_m++ * *p_v++;
00104 return f_sum;
00105 }
00106
00107
00116 template <class T>
00117 inline T CTBdot(const CTBmatrix<T>& m, CTBint i_row, const CTBvector<T>& v,
00118 CTBint i_beg, CTBint i_end)
00119 {
00120 const T* p_m = &m(i_row,i_beg);
00121 const T* p_v = &v(i_beg);
00122 CTBtraits<T>::Sum_t f_sum = 0.;
00123
00124 #ifdef CTB__IndexCheck
00125 CTBint n = CTBmin(m.NColumn(), v.Size());
00126 if (i_end >= i_beg && (i_end < 0 || i_end >= n))
00127 throw CTBexceptionIndexRange(i_end,n,
00128 "CTBdot(CTBmatrix&,CTBint,CTBvector&,CTBint,CTBint)");
00129 #endif
00130
00131 for (CTBint i = i_beg; i <= i_end; i++) f_sum += *p_m++ * *p_v++;
00132 return f_sum;
00133 }
00134
00135
00146 template <class T>
00147 inline T CTBdot(CTBint i_col, const CTBmatrix<T>& m, const CTBvector<T>& v)
00148 {
00149 const T* p_m = &m(0,i_col);
00150 const T* p_v = v;
00151 CTBint i_nc = m.NColumn();
00152 CTBtraits<T>::Sum_t f_sum = 0.;
00153
00154 #ifdef CTB__ConformityCheck
00155 CTBint n = m.NRow();
00156 if (n != v.Size())
00157 throw CTBexceptionConformity(n, v.Size(),
00158 "CTBdot(CTBint,CTBmatrix&,CTBvector&)");
00159 #else
00160 CTBint n = CTBmin(m.NRow(), v.Size());
00161 #endif
00162
00163 for (CTBint i = 0; i < n; i++) {
00164 f_sum += *p_m * *p_v++;
00165 p_m += i_nc;
00166 }
00167
00168 return f_sum;
00169 }
00170
00171
00181 template <class T>
00182 inline T CTBdot(CTBint i_col, const CTBmatrix<T>& m, const CTBvector<T>& v,
00183 CTBint i_beg, CTBint i_end)
00184 {
00185 const T* p_m = &m(i_beg,i_col);
00186 const T* p_v = &v(i_beg);
00187 CTBint i_nc = m.NColumn();
00188 CTBtraits<T>::Sum_t f_sum = 0.;
00189
00190 #ifdef CTB__IndexCheck
00191 CTBint n = CTBmin(m.NRow(), v.Size());
00192 if (i_end >= i_beg && (i_end < 0 || i_end >= n))
00193 throw CTBexceptionIndexRange(i_end,n,
00194 "CTBdot(CTBint,CTBmatrix&,CTBvector&,CTBint,CTBint)");
00195 #endif
00196
00197 for (CTBint i = i_beg; i <= i_end; i++) {
00198 f_sum += *p_m * *p_v++;
00199 p_m += i_nc;
00200 }
00201
00202 return f_sum;
00203 }
00204
00205
00218 template <class T>
00219 inline T CTBdot(const CTBmatrix<T>& m1, CTBint i_row,
00220 CTBint i_col, const CTBmatrix<T>& m2)
00221 {
00222 const T* p_m1 = &m1(i_row,0);
00223 const T* p_m2 = &m2(0,i_col);
00224 CTBint i_nc2 = m2.NColumn();
00225 CTBtraits<T>::Sum_t f_sum = 0.;
00226
00227 #ifdef CTB__ConformityCheck
00228 CTBint n = m1.NColumn();
00229 if (n != m2.NRow())
00230 throw CTBexceptionConformity(n, m2.NRow(),
00231 "CTBdot(CTBmatrix&,CTBint,CTBint,CTBmatrix&)");
00232 #else
00233 CTBint n = CTBmin(m1.NColumn(), m2.NRow());
00234 #endif
00235
00236 for (CTBint i = 0; i < n; i++) {
00237 f_sum += *p_m1++ * *p_m2;
00238 p_m2 += i_nc2;
00239 }
00240
00241 return f_sum;
00242 }
00243
00244
00254 template <class T>
00255 inline T CTBdot(const CTBmatrix<T>& m1, CTBint i_row,
00256 CTBint i_col, const CTBmatrix<T>& m2,
00257 CTBint i_beg, CTBint i_end)
00258 {
00259 const T* p_m1 = &m1(i_row,i_beg);
00260 const T* p_m2 = &m2(i_beg,i_col);
00261 CTBint i_nc2 = m2.NColumn();
00262 CTBtraits<T>::Sum_t f_sum = 0.;
00263
00264 #ifdef CTB__IndexCheck
00265 CTBint n = CTBmin(m1.NColumn(),m2.NRow() );
00266 if (i_end >= i_beg && (i_end < 0 || i_end >= n))
00267 throw CTBexceptionIndexRange(i_end,n,
00268 "CTBdot(CTBmatrix&,CTBint,CTBint,CTBmatrix&,CTBint,CTBint)");
00269 #endif
00270
00271 for (CTBint i = i_beg; i <= i_end; i++) {
00272 f_sum += *p_m1++ * *p_m2;
00273 p_m2 += i_nc2;
00274 }
00275
00276 return f_sum;
00277 }
00278
00279