...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
00001 // 00002 // Copyright (c) 2000-2002 00003 // Joerg Walter, Mathias Koch 00004 // 00005 // Distributed under the Boost Software License, Version 1.0. (See 00006 // accompanying file LICENSE_1_0.txt or copy at 00007 // http://www.boost.org/LICENSE_1_0.txt) 00008 // 00009 // The authors gratefully acknowledge the support of 00010 // GeNeSys mbH & Co. KG in producing this work. 00011 // 00012 00013 #ifndef _BOOST_UBLAS_BLAS_ 00014 #define _BOOST_UBLAS_BLAS_ 00015 00016 #include <boost/numeric/ublas/traits.hpp> 00017 00018 namespace boost { namespace numeric { namespace ublas { 00019 00020 00026 namespace blas_1 { 00027 00035 template<class V> 00036 typename type_traits<typename V::value_type>::real_type 00037 asum (const V &v) { 00038 return norm_1 (v); 00039 } 00040 00048 template<class V> 00049 typename type_traits<typename V::value_type>::real_type 00050 nrm2 (const V &v) { 00051 return norm_2 (v); 00052 } 00053 00061 template<class V> 00062 typename type_traits<typename V::value_type>::real_type 00063 amax (const V &v) { 00064 return norm_inf (v); 00065 } 00066 00076 template<class V1, class V2> 00077 typename promote_traits<typename V1::value_type, typename V2::value_type>::promote_type 00078 dot (const V1 &v1, const V2 &v2) { 00079 return inner_prod (v1, v2); 00080 } 00081 00091 template<class V1, class V2> 00092 V1 & copy (V1 &v1, const V2 &v2) 00093 { 00094 return v1.assign (v2); 00095 } 00096 00105 template<class V1, class V2> 00106 void swap (V1 &v1, V2 &v2) 00107 { 00108 v1.swap (v2); 00109 } 00110 00120 template<class V, class T> 00121 V & scal (V &v, const T &t) 00122 { 00123 return v *= t; 00124 } 00125 00137 template<class V1, class T, class V2> 00138 V1 & axpy (V1 &v1, const T &t, const V2 &v2) 00139 { 00140 return v1.plus_assign (t * v2); 00141 } 00142 00160 template<class T1, class V1, class T2, class V2> 00161 void rot (const T1 &t1, V1 &v1, const T2 &t2, V2 &v2) 00162 { 00163 typedef typename promote_traits<typename V1::value_type, typename V2::value_type>::promote_type promote_type; 00164 vector<promote_type> vt (t1 * v1 + t2 * v2); 00165 v2.assign (- t2 * v1 + t1 * v2); 00166 v1.assign (vt); 00167 } 00168 00169 } 00170 00176 namespace blas_2 { 00177 00187 template<class V, class M> 00188 V & tmv (V &v, const M &m) 00189 { 00190 return v = prod (m, v); 00191 } 00192 00204 template<class V, class M, class C> 00205 V & tsv (V &v, const M &m, C) 00206 { 00207 return v = solve (m, v, C ()); 00208 } 00209 00225 template<class V1, class T1, class T2, class M, class V2> 00226 V1 & gmv (V1 &v1, const T1 &t1, const T2 &t2, const M &m, const V2 &v2) 00227 { 00228 return v1 = t1 * v1 + t2 * prod (m, v2); 00229 } 00230 00244 template<class M, class T, class V1, class V2> 00245 M & gr (M &m, const T &t, const V1 &v1, const V2 &v2) 00246 { 00247 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG 00248 return m += t * outer_prod (v1, v2); 00249 #else 00250 return m = m + t * outer_prod (v1, v2); 00251 #endif 00252 } 00253 00265 template<class M, class T, class V> 00266 M & sr (M &m, const T &t, const V &v) 00267 { 00268 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG 00269 return m += t * outer_prod (v, v); 00270 #else 00271 return m = m + t * outer_prod (v, v); 00272 #endif 00273 } 00274 00286 template<class M, class T, class V> 00287 M & hr (M &m, const T &t, const V &v) 00288 { 00289 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG 00290 return m += t * outer_prod (v, conj (v)); 00291 #else 00292 return m = m + t * outer_prod (v, conj (v)); 00293 #endif 00294 } 00295 00309 template<class M, class T, class V1, class V2> 00310 M & sr2 (M &m, const T &t, const V1 &v1, const V2 &v2) 00311 { 00312 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG 00313 return m += t * (outer_prod (v1, v2) + outer_prod (v2, v1)); 00314 #else 00315 return m = m + t * (outer_prod (v1, v2) + outer_prod (v2, v1)); 00316 #endif 00317 } 00318 00332 template<class M, class T, class V1, class V2> 00333 M & hr2 (M &m, const T &t, const V1 &v1, const V2 &v2) 00334 { 00335 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG 00336 return m += t * outer_prod (v1, conj (v2)) + type_traits<T>::conj (t) * outer_prod (v2, conj (v1)); 00337 #else 00338 return m = m + t * outer_prod (v1, conj (v2)) + type_traits<T>::conj (t) * outer_prod (v2, conj (v1)); 00339 #endif 00340 } 00341 00342 } 00343 00349 namespace blas_3 { 00350 00365 template<class M1, class T, class M2, class M3> 00366 M1 & tmm (M1 &m1, const T &t, const M2 &m2, const M3 &m3) 00367 { 00368 return m1 = t * prod (m2, m3); 00369 } 00370 00384 template<class M1, class T, class M2, class C> 00385 M1 & tsm (M1 &m1, const T &t, const M2 &m2, C) 00386 { 00387 return m1 = solve (m2, t * m1, C ()); 00388 } 00389 00405 template<class M1, class T1, class T2, class M2, class M3> 00406 M1 & gmm (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3) 00407 { 00408 return m1 = t1 * m1 + t2 * prod (m2, m3); 00409 } 00410 00425 template<class M1, class T1, class T2, class M2> 00426 M1 & srk (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2) 00427 { 00428 return m1 = t1 * m1 + t2 * prod (m2, trans (m2)); 00429 } 00430 00445 template<class M1, class T1, class T2, class M2> 00446 M1 & hrk (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2) 00447 { 00448 return m1 = t1 * m1 + t2 * prod (m2, herm (m2)); 00449 } 00450 00467 template<class M1, class T1, class T2, class M2, class M3> 00468 M1 & sr2k (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3) 00469 { 00470 return m1 = t1 * m1 + t2 * (prod (m2, trans (m3)) + prod (m3, trans (m2))); 00471 } 00472 00489 template<class M1, class T1, class T2, class M2, class M3> 00490 M1 & hr2k (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3) 00491 { 00492 return m1 = 00493 t1 * m1 00494 + t2 * prod (m2, herm (m3)) 00495 + type_traits<T2>::conj (t2) * prod (m3, herm (m2)); 00496 } 00497 00498 } 00499 00500 }}} 00501 00502 #endif