Chris@16
|
1 // Copyright (c) 2000-2011 Joerg Walter, Mathias Koch, David Bellot
|
Chris@16
|
2 //
|
Chris@16
|
3 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
4 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
5 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 //
|
Chris@16
|
7 // The authors gratefully acknowledge the support of
|
Chris@16
|
8 // GeNeSys mbH & Co. KG in producing this work.
|
Chris@16
|
9
|
Chris@16
|
10 #ifndef _BOOST_UBLAS_BLAS_
|
Chris@16
|
11 #define _BOOST_UBLAS_BLAS_
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/numeric/ublas/traits.hpp>
|
Chris@16
|
14
|
Chris@16
|
15 namespace boost { namespace numeric { namespace ublas {
|
Chris@16
|
16
|
Chris@16
|
17
|
Chris@16
|
18 /** Interface and implementation of BLAS level 1
|
Chris@16
|
19 * This includes functions which perform \b vector-vector operations.
|
Chris@16
|
20 * More information about BLAS can be found at
|
Chris@16
|
21 * <a href="http://en.wikipedia.org/wiki/BLAS">http://en.wikipedia.org/wiki/BLAS</a>
|
Chris@16
|
22 */
|
Chris@16
|
23 namespace blas_1 {
|
Chris@16
|
24
|
Chris@16
|
25 /** 1-Norm: \f$\sum_i |x_i|\f$ (also called \f$\mathcal{L}_1\f$ or Manhattan norm)
|
Chris@16
|
26 *
|
Chris@16
|
27 * \param v a vector or vector expression
|
Chris@16
|
28 * \return the 1-Norm with type of the vector's type
|
Chris@16
|
29 *
|
Chris@16
|
30 * \tparam V type of the vector (not needed by default)
|
Chris@16
|
31 */
|
Chris@16
|
32 template<class V>
|
Chris@16
|
33 typename type_traits<typename V::value_type>::real_type
|
Chris@16
|
34 asum (const V &v) {
|
Chris@16
|
35 return norm_1 (v);
|
Chris@16
|
36 }
|
Chris@16
|
37
|
Chris@16
|
38 /** 2-Norm: \f$\sum_i |x_i|^2\f$ (also called \f$\mathcal{L}_2\f$ or Euclidean norm)
|
Chris@16
|
39 *
|
Chris@16
|
40 * \param v a vector or vector expression
|
Chris@16
|
41 * \return the 2-Norm with type of the vector's type
|
Chris@16
|
42 *
|
Chris@16
|
43 * \tparam V type of the vector (not needed by default)
|
Chris@16
|
44 */
|
Chris@16
|
45 template<class V>
|
Chris@16
|
46 typename type_traits<typename V::value_type>::real_type
|
Chris@16
|
47 nrm2 (const V &v) {
|
Chris@16
|
48 return norm_2 (v);
|
Chris@16
|
49 }
|
Chris@16
|
50
|
Chris@16
|
51 /** Infinite-norm: \f$\max_i |x_i|\f$ (also called \f$\mathcal{L}_\infty\f$ norm)
|
Chris@16
|
52 *
|
Chris@16
|
53 * \param v a vector or vector expression
|
Chris@16
|
54 * \return the Infinite-Norm with type of the vector's type
|
Chris@16
|
55 *
|
Chris@16
|
56 * \tparam V type of the vector (not needed by default)
|
Chris@16
|
57 */
|
Chris@16
|
58 template<class V>
|
Chris@16
|
59 typename type_traits<typename V::value_type>::real_type
|
Chris@16
|
60 amax (const V &v) {
|
Chris@16
|
61 return norm_inf (v);
|
Chris@16
|
62 }
|
Chris@16
|
63
|
Chris@16
|
64 /** Inner product of vectors \f$v_1\f$ and \f$v_2\f$
|
Chris@16
|
65 *
|
Chris@16
|
66 * \param v1 first vector of the inner product
|
Chris@16
|
67 * \param v2 second vector of the inner product
|
Chris@16
|
68 * \return the inner product of the type of the most generic type of the 2 vectors
|
Chris@16
|
69 *
|
Chris@16
|
70 * \tparam V1 type of first vector (not needed by default)
|
Chris@16
|
71 * \tparam V2 type of second vector (not needed by default)
|
Chris@16
|
72 */
|
Chris@16
|
73 template<class V1, class V2>
|
Chris@16
|
74 typename promote_traits<typename V1::value_type, typename V2::value_type>::promote_type
|
Chris@16
|
75 dot (const V1 &v1, const V2 &v2) {
|
Chris@16
|
76 return inner_prod (v1, v2);
|
Chris@16
|
77 }
|
Chris@16
|
78
|
Chris@16
|
79 /** Copy vector \f$v_2\f$ to \f$v_1\f$
|
Chris@16
|
80 *
|
Chris@16
|
81 * \param v1 target vector
|
Chris@16
|
82 * \param v2 source vector
|
Chris@16
|
83 * \return a reference to the target vector
|
Chris@16
|
84 *
|
Chris@16
|
85 * \tparam V1 type of first vector (not needed by default)
|
Chris@16
|
86 * \tparam V2 type of second vector (not needed by default)
|
Chris@16
|
87 */
|
Chris@16
|
88 template<class V1, class V2>
|
Chris@16
|
89 V1 & copy (V1 &v1, const V2 &v2)
|
Chris@16
|
90 {
|
Chris@16
|
91 return v1.assign (v2);
|
Chris@16
|
92 }
|
Chris@16
|
93
|
Chris@16
|
94 /** Swap vectors \f$v_1\f$ and \f$v_2\f$
|
Chris@16
|
95 *
|
Chris@16
|
96 * \param v1 first vector
|
Chris@16
|
97 * \param v2 second vector
|
Chris@16
|
98 *
|
Chris@16
|
99 * \tparam V1 type of first vector (not needed by default)
|
Chris@16
|
100 * \tparam V2 type of second vector (not needed by default)
|
Chris@16
|
101 */
|
Chris@16
|
102 template<class V1, class V2>
|
Chris@16
|
103 void swap (V1 &v1, V2 &v2)
|
Chris@16
|
104 {
|
Chris@16
|
105 v1.swap (v2);
|
Chris@16
|
106 }
|
Chris@16
|
107
|
Chris@16
|
108 /** scale vector \f$v\f$ with scalar \f$t\f$
|
Chris@16
|
109 *
|
Chris@16
|
110 * \param v vector to be scaled
|
Chris@16
|
111 * \param t the scalar
|
Chris@16
|
112 * \return \c t*v
|
Chris@16
|
113 *
|
Chris@16
|
114 * \tparam V type of the vector (not needed by default)
|
Chris@16
|
115 * \tparam T type of the scalar (not needed by default)
|
Chris@16
|
116 */
|
Chris@16
|
117 template<class V, class T>
|
Chris@16
|
118 V & scal (V &v, const T &t)
|
Chris@16
|
119 {
|
Chris@16
|
120 return v *= t;
|
Chris@16
|
121 }
|
Chris@16
|
122
|
Chris@16
|
123 /** Compute \f$v_1= v_1 + t.v_2\f$
|
Chris@16
|
124 *
|
Chris@16
|
125 * \param v1 target and first vector
|
Chris@16
|
126 * \param t the scalar
|
Chris@16
|
127 * \param v2 second vector
|
Chris@16
|
128 * \return a reference to the first and target vector
|
Chris@16
|
129 *
|
Chris@16
|
130 * \tparam V1 type of the first vector (not needed by default)
|
Chris@16
|
131 * \tparam T type of the scalar (not needed by default)
|
Chris@16
|
132 * \tparam V2 type of the second vector (not needed by default)
|
Chris@16
|
133 */
|
Chris@16
|
134 template<class V1, class T, class V2>
|
Chris@16
|
135 V1 & axpy (V1 &v1, const T &t, const V2 &v2)
|
Chris@16
|
136 {
|
Chris@16
|
137 return v1.plus_assign (t * v2);
|
Chris@16
|
138 }
|
Chris@16
|
139
|
Chris@16
|
140 /** Performs rotation of points in the plane and assign the result to the first vector
|
Chris@16
|
141 *
|
Chris@16
|
142 * Each point is defined as a pair \c v1(i) and \c v2(i), being respectively
|
Chris@16
|
143 * the \f$x\f$ and \f$y\f$ coordinates. The parameters \c t1 and \t2 are respectively
|
Chris@16
|
144 * the cosine and sine of the angle of the rotation.
|
Chris@16
|
145 * Results are not returned but directly written into \c v1.
|
Chris@16
|
146 *
|
Chris@16
|
147 * \param t1 cosine of the rotation
|
Chris@16
|
148 * \param v1 vector of \f$x\f$ values
|
Chris@16
|
149 * \param t2 sine of the rotation
|
Chris@16
|
150 * \param v2 vector of \f$y\f$ values
|
Chris@16
|
151 *
|
Chris@16
|
152 * \tparam T1 type of the cosine value (not needed by default)
|
Chris@16
|
153 * \tparam V1 type of the \f$x\f$ vector (not needed by default)
|
Chris@16
|
154 * \tparam T2 type of the sine value (not needed by default)
|
Chris@16
|
155 * \tparam V2 type of the \f$y\f$ vector (not needed by default)
|
Chris@16
|
156 */
|
Chris@16
|
157 template<class T1, class V1, class T2, class V2>
|
Chris@16
|
158 void rot (const T1 &t1, V1 &v1, const T2 &t2, V2 &v2)
|
Chris@16
|
159 {
|
Chris@16
|
160 typedef typename promote_traits<typename V1::value_type, typename V2::value_type>::promote_type promote_type;
|
Chris@16
|
161 vector<promote_type> vt (t1 * v1 + t2 * v2);
|
Chris@16
|
162 v2.assign (- t2 * v1 + t1 * v2);
|
Chris@16
|
163 v1.assign (vt);
|
Chris@16
|
164 }
|
Chris@16
|
165
|
Chris@16
|
166 }
|
Chris@16
|
167
|
Chris@16
|
168 /** \brief Interface and implementation of BLAS level 2
|
Chris@16
|
169 * This includes functions which perform \b matrix-vector operations.
|
Chris@16
|
170 * More information about BLAS can be found at
|
Chris@16
|
171 * <a href="http://en.wikipedia.org/wiki/BLAS">http://en.wikipedia.org/wiki/BLAS</a>
|
Chris@16
|
172 */
|
Chris@16
|
173 namespace blas_2 {
|
Chris@16
|
174
|
Chris@16
|
175 /** \brief multiply vector \c v with triangular matrix \c m
|
Chris@16
|
176 *
|
Chris@16
|
177 * \param v a vector
|
Chris@16
|
178 * \param m a triangular matrix
|
Chris@16
|
179 * \return the result of the product
|
Chris@16
|
180 *
|
Chris@16
|
181 * \tparam V type of the vector (not needed by default)
|
Chris@16
|
182 * \tparam M type of the matrix (not needed by default)
|
Chris@16
|
183 */
|
Chris@16
|
184 template<class V, class M>
|
Chris@16
|
185 V & tmv (V &v, const M &m)
|
Chris@16
|
186 {
|
Chris@16
|
187 return v = prod (m, v);
|
Chris@16
|
188 }
|
Chris@16
|
189
|
Chris@16
|
190 /** \brief solve \f$m.x = v\f$ in place, where \c m is a triangular matrix
|
Chris@16
|
191 *
|
Chris@16
|
192 * \param v a vector
|
Chris@16
|
193 * \param m a matrix
|
Chris@16
|
194 * \param C (this parameter is not needed)
|
Chris@16
|
195 * \return a result vector from the above operation
|
Chris@16
|
196 *
|
Chris@16
|
197 * \tparam V type of the vector (not needed by default)
|
Chris@16
|
198 * \tparam M type of the matrix (not needed by default)
|
Chris@16
|
199 * \tparam C n/a
|
Chris@16
|
200 */
|
Chris@16
|
201 template<class V, class M, class C>
|
Chris@16
|
202 V & tsv (V &v, const M &m, C)
|
Chris@16
|
203 {
|
Chris@16
|
204 return v = solve (m, v, C ());
|
Chris@16
|
205 }
|
Chris@16
|
206
|
Chris@16
|
207 /** \brief compute \f$ v_1 = t_1.v_1 + t_2.(m.v_2)\f$, a general matrix-vector product
|
Chris@16
|
208 *
|
Chris@16
|
209 * \param v1 a vector
|
Chris@16
|
210 * \param t1 a scalar
|
Chris@16
|
211 * \param t2 another scalar
|
Chris@16
|
212 * \param m a matrix
|
Chris@16
|
213 * \param v2 another vector
|
Chris@16
|
214 * \return the vector \c v1 with the result from the above operation
|
Chris@16
|
215 *
|
Chris@16
|
216 * \tparam V1 type of first vector (not needed by default)
|
Chris@16
|
217 * \tparam T1 type of first scalar (not needed by default)
|
Chris@16
|
218 * \tparam T2 type of second scalar (not needed by default)
|
Chris@16
|
219 * \tparam M type of matrix (not needed by default)
|
Chris@16
|
220 * \tparam V2 type of second vector (not needed by default)
|
Chris@16
|
221 */
|
Chris@16
|
222 template<class V1, class T1, class T2, class M, class V2>
|
Chris@16
|
223 V1 & gmv (V1 &v1, const T1 &t1, const T2 &t2, const M &m, const V2 &v2)
|
Chris@16
|
224 {
|
Chris@16
|
225 return v1 = t1 * v1 + t2 * prod (m, v2);
|
Chris@16
|
226 }
|
Chris@16
|
227
|
Chris@16
|
228 /** \brief Rank 1 update: \f$ m = m + t.(v_1.v_2^T)\f$
|
Chris@16
|
229 *
|
Chris@16
|
230 * \param m a matrix
|
Chris@16
|
231 * \param t a scalar
|
Chris@16
|
232 * \param v1 a vector
|
Chris@16
|
233 * \param v2 another vector
|
Chris@16
|
234 * \return a matrix with the result from the above operation
|
Chris@16
|
235 *
|
Chris@16
|
236 * \tparam M type of matrix (not needed by default)
|
Chris@16
|
237 * \tparam T type of scalar (not needed by default)
|
Chris@16
|
238 * \tparam V1 type of first vector (not needed by default)
|
Chris@16
|
239 * \tparam V2type of second vector (not needed by default)
|
Chris@16
|
240 */
|
Chris@16
|
241 template<class M, class T, class V1, class V2>
|
Chris@16
|
242 M & gr (M &m, const T &t, const V1 &v1, const V2 &v2)
|
Chris@16
|
243 {
|
Chris@16
|
244 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG
|
Chris@16
|
245 return m += t * outer_prod (v1, v2);
|
Chris@16
|
246 #else
|
Chris@16
|
247 return m = m + t * outer_prod (v1, v2);
|
Chris@16
|
248 #endif
|
Chris@16
|
249 }
|
Chris@16
|
250
|
Chris@16
|
251 /** \brief symmetric rank 1 update: \f$m = m + t.(v.v^T)\f$
|
Chris@16
|
252 *
|
Chris@16
|
253 * \param m a matrix
|
Chris@16
|
254 * \param t a scalar
|
Chris@16
|
255 * \param v a vector
|
Chris@16
|
256 * \return a matrix with the result from the above operation
|
Chris@16
|
257 *
|
Chris@16
|
258 * \tparam M type of matrix (not needed by default)
|
Chris@16
|
259 * \tparam T type of scalar (not needed by default)
|
Chris@16
|
260 * \tparam V type of vector (not needed by default)
|
Chris@16
|
261 */
|
Chris@16
|
262 template<class M, class T, class V>
|
Chris@16
|
263 M & sr (M &m, const T &t, const V &v)
|
Chris@16
|
264 {
|
Chris@16
|
265 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG
|
Chris@16
|
266 return m += t * outer_prod (v, v);
|
Chris@16
|
267 #else
|
Chris@16
|
268 return m = m + t * outer_prod (v, v);
|
Chris@16
|
269 #endif
|
Chris@16
|
270 }
|
Chris@16
|
271
|
Chris@16
|
272 /** \brief hermitian rank 1 update: \f$m = m + t.(v.v^H)\f$
|
Chris@16
|
273 *
|
Chris@16
|
274 * \param m a matrix
|
Chris@16
|
275 * \param t a scalar
|
Chris@16
|
276 * \param v a vector
|
Chris@16
|
277 * \return a matrix with the result from the above operation
|
Chris@16
|
278 *
|
Chris@16
|
279 * \tparam M type of matrix (not needed by default)
|
Chris@16
|
280 * \tparam T type of scalar (not needed by default)
|
Chris@16
|
281 * \tparam V type of vector (not needed by default)
|
Chris@16
|
282 */
|
Chris@16
|
283 template<class M, class T, class V>
|
Chris@16
|
284 M & hr (M &m, const T &t, const V &v)
|
Chris@16
|
285 {
|
Chris@16
|
286 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG
|
Chris@16
|
287 return m += t * outer_prod (v, conj (v));
|
Chris@16
|
288 #else
|
Chris@16
|
289 return m = m + t * outer_prod (v, conj (v));
|
Chris@16
|
290 #endif
|
Chris@16
|
291 }
|
Chris@16
|
292
|
Chris@16
|
293 /** \brief symmetric rank 2 update: \f$ m=m+ t.(v_1.v_2^T + v_2.v_1^T)\f$
|
Chris@16
|
294 *
|
Chris@16
|
295 * \param m a matrix
|
Chris@16
|
296 * \param t a scalar
|
Chris@16
|
297 * \param v1 a vector
|
Chris@16
|
298 * \param v2 another vector
|
Chris@16
|
299 * \return a matrix with the result from the above operation
|
Chris@16
|
300 *
|
Chris@16
|
301 * \tparam M type of matrix (not needed by default)
|
Chris@16
|
302 * \tparam T type of scalar (not needed by default)
|
Chris@16
|
303 * \tparam V1 type of first vector (not needed by default)
|
Chris@16
|
304 * \tparam V2type of second vector (not needed by default)
|
Chris@16
|
305 */
|
Chris@16
|
306 template<class M, class T, class V1, class V2>
|
Chris@16
|
307 M & sr2 (M &m, const T &t, const V1 &v1, const V2 &v2)
|
Chris@16
|
308 {
|
Chris@16
|
309 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG
|
Chris@16
|
310 return m += t * (outer_prod (v1, v2) + outer_prod (v2, v1));
|
Chris@16
|
311 #else
|
Chris@16
|
312 return m = m + t * (outer_prod (v1, v2) + outer_prod (v2, v1));
|
Chris@16
|
313 #endif
|
Chris@16
|
314 }
|
Chris@16
|
315
|
Chris@16
|
316 /** \brief hermitian rank 2 update: \f$m=m+t.(v_1.v_2^H) + v_2.(t.v_1)^H)\f$
|
Chris@16
|
317 *
|
Chris@16
|
318 * \param m a matrix
|
Chris@16
|
319 * \param t a scalar
|
Chris@16
|
320 * \param v1 a vector
|
Chris@16
|
321 * \param v2 another vector
|
Chris@16
|
322 * \return a matrix with the result from the above operation
|
Chris@16
|
323 *
|
Chris@16
|
324 * \tparam M type of matrix (not needed by default)
|
Chris@16
|
325 * \tparam T type of scalar (not needed by default)
|
Chris@16
|
326 * \tparam V1 type of first vector (not needed by default)
|
Chris@16
|
327 * \tparam V2type of second vector (not needed by default)
|
Chris@16
|
328 */
|
Chris@16
|
329 template<class M, class T, class V1, class V2>
|
Chris@16
|
330 M & hr2 (M &m, const T &t, const V1 &v1, const V2 &v2)
|
Chris@16
|
331 {
|
Chris@16
|
332 #ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG
|
Chris@16
|
333 return m += t * outer_prod (v1, conj (v2)) + type_traits<T>::conj (t) * outer_prod (v2, conj (v1));
|
Chris@16
|
334 #else
|
Chris@16
|
335 return m = m + t * outer_prod (v1, conj (v2)) + type_traits<T>::conj (t) * outer_prod (v2, conj (v1));
|
Chris@16
|
336 #endif
|
Chris@16
|
337 }
|
Chris@16
|
338
|
Chris@16
|
339 }
|
Chris@16
|
340
|
Chris@16
|
341 /** \brief Interface and implementation of BLAS level 3
|
Chris@16
|
342 * This includes functions which perform \b matrix-matrix operations.
|
Chris@16
|
343 * More information about BLAS can be found at
|
Chris@16
|
344 * <a href="http://en.wikipedia.org/wiki/BLAS">http://en.wikipedia.org/wiki/BLAS</a>
|
Chris@16
|
345 */
|
Chris@16
|
346 namespace blas_3 {
|
Chris@16
|
347
|
Chris@16
|
348 /** \brief triangular matrix multiplication \f$m_1=t.m_2.m_3\f$ where \f$m_2\f$ and \f$m_3\f$ are triangular
|
Chris@16
|
349 *
|
Chris@16
|
350 * \param m1 a matrix for storing result
|
Chris@16
|
351 * \param t a scalar
|
Chris@16
|
352 * \param m2 a triangular matrix
|
Chris@16
|
353 * \param m3 a triangular matrix
|
Chris@16
|
354 * \return the matrix \c m1
|
Chris@16
|
355 *
|
Chris@16
|
356 * \tparam M1 type of the result matrix (not needed by default)
|
Chris@16
|
357 * \tparam T type of the scalar (not needed by default)
|
Chris@16
|
358 * \tparam M2 type of the first triangular matrix (not needed by default)
|
Chris@16
|
359 * \tparam M3 type of the second triangular matrix (not needed by default)
|
Chris@16
|
360 *
|
Chris@16
|
361 */
|
Chris@16
|
362 template<class M1, class T, class M2, class M3>
|
Chris@16
|
363 M1 & tmm (M1 &m1, const T &t, const M2 &m2, const M3 &m3)
|
Chris@16
|
364 {
|
Chris@16
|
365 return m1 = t * prod (m2, m3);
|
Chris@16
|
366 }
|
Chris@16
|
367
|
Chris@16
|
368 /** \brief triangular solve \f$ m_2.x = t.m_1\f$ in place, \f$m_2\f$ is a triangular matrix
|
Chris@16
|
369 *
|
Chris@16
|
370 * \param m1 a matrix
|
Chris@16
|
371 * \param t a scalar
|
Chris@16
|
372 * \param m2 a triangular matrix
|
Chris@16
|
373 * \param C (not used)
|
Chris@16
|
374 * \return the \f$m_1\f$ matrix
|
Chris@16
|
375 *
|
Chris@16
|
376 * \tparam M1 type of the first matrix (not needed by default)
|
Chris@16
|
377 * \tparam T type of the scalar (not needed by default)
|
Chris@16
|
378 * \tparam M2 type of the triangular matrix (not needed by default)
|
Chris@16
|
379 * \tparam C (n/a)
|
Chris@16
|
380 */
|
Chris@16
|
381 template<class M1, class T, class M2, class C>
|
Chris@16
|
382 M1 & tsm (M1 &m1, const T &t, const M2 &m2, C)
|
Chris@16
|
383 {
|
Chris@16
|
384 return m1 = solve (m2, t * m1, C ());
|
Chris@16
|
385 }
|
Chris@16
|
386
|
Chris@16
|
387 /** \brief general matrix multiplication \f$m_1=t_1.m_1 + t_2.m_2.m_3\f$
|
Chris@16
|
388 *
|
Chris@16
|
389 * \param m1 first matrix
|
Chris@16
|
390 * \param t1 first scalar
|
Chris@16
|
391 * \param t2 second scalar
|
Chris@16
|
392 * \param m2 second matrix
|
Chris@16
|
393 * \param m3 third matrix
|
Chris@16
|
394 * \return the matrix \c m1
|
Chris@16
|
395 *
|
Chris@16
|
396 * \tparam M1 type of the first matrix (not needed by default)
|
Chris@16
|
397 * \tparam T1 type of the first scalar (not needed by default)
|
Chris@16
|
398 * \tparam T2 type of the second scalar (not needed by default)
|
Chris@16
|
399 * \tparam M2 type of the second matrix (not needed by default)
|
Chris@16
|
400 * \tparam M3 type of the third matrix (not needed by default)
|
Chris@16
|
401 */
|
Chris@16
|
402 template<class M1, class T1, class T2, class M2, class M3>
|
Chris@16
|
403 M1 & gmm (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3)
|
Chris@16
|
404 {
|
Chris@16
|
405 return m1 = t1 * m1 + t2 * prod (m2, m3);
|
Chris@16
|
406 }
|
Chris@16
|
407
|
Chris@16
|
408 /** \brief symmetric rank \a k update: \f$m_1=t.m_1+t_2.(m_2.m_2^T)\f$
|
Chris@16
|
409 *
|
Chris@16
|
410 * \param m1 first matrix
|
Chris@16
|
411 * \param t1 first scalar
|
Chris@16
|
412 * \param t2 second scalar
|
Chris@16
|
413 * \param m2 second matrix
|
Chris@16
|
414 * \return matrix \c m1
|
Chris@16
|
415 *
|
Chris@16
|
416 * \tparam M1 type of the first matrix (not needed by default)
|
Chris@16
|
417 * \tparam T1 type of the first scalar (not needed by default)
|
Chris@16
|
418 * \tparam T2 type of the second scalar (not needed by default)
|
Chris@16
|
419 * \tparam M2 type of the second matrix (not needed by default)
|
Chris@16
|
420 * \todo use opb_prod()
|
Chris@16
|
421 */
|
Chris@16
|
422 template<class M1, class T1, class T2, class M2>
|
Chris@16
|
423 M1 & srk (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2)
|
Chris@16
|
424 {
|
Chris@16
|
425 return m1 = t1 * m1 + t2 * prod (m2, trans (m2));
|
Chris@16
|
426 }
|
Chris@16
|
427
|
Chris@16
|
428 /** \brief hermitian rank \a k update: \f$m_1=t.m_1+t_2.(m_2.m2^H)\f$
|
Chris@16
|
429 *
|
Chris@16
|
430 * \param m1 first matrix
|
Chris@16
|
431 * \param t1 first scalar
|
Chris@16
|
432 * \param t2 second scalar
|
Chris@16
|
433 * \param m2 second matrix
|
Chris@16
|
434 * \return matrix \c m1
|
Chris@16
|
435 *
|
Chris@16
|
436 * \tparam M1 type of the first matrix (not needed by default)
|
Chris@16
|
437 * \tparam T1 type of the first scalar (not needed by default)
|
Chris@16
|
438 * \tparam T2 type of the second scalar (not needed by default)
|
Chris@16
|
439 * \tparam M2 type of the second matrix (not needed by default)
|
Chris@16
|
440 * \todo use opb_prod()
|
Chris@16
|
441 */
|
Chris@16
|
442 template<class M1, class T1, class T2, class M2>
|
Chris@16
|
443 M1 & hrk (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2)
|
Chris@16
|
444 {
|
Chris@16
|
445 return m1 = t1 * m1 + t2 * prod (m2, herm (m2));
|
Chris@16
|
446 }
|
Chris@16
|
447
|
Chris@16
|
448 /** \brief generalized symmetric rank \a k update: \f$m_1=t_1.m_1+t_2.(m_2.m3^T)+t_2.(m_3.m2^T)\f$
|
Chris@16
|
449 *
|
Chris@16
|
450 * \param m1 first matrix
|
Chris@16
|
451 * \param t1 first scalar
|
Chris@16
|
452 * \param t2 second scalar
|
Chris@16
|
453 * \param m2 second matrix
|
Chris@16
|
454 * \param m3 third matrix
|
Chris@16
|
455 * \return matrix \c m1
|
Chris@16
|
456 *
|
Chris@16
|
457 * \tparam M1 type of the first matrix (not needed by default)
|
Chris@16
|
458 * \tparam T1 type of the first scalar (not needed by default)
|
Chris@16
|
459 * \tparam T2 type of the second scalar (not needed by default)
|
Chris@16
|
460 * \tparam M2 type of the second matrix (not needed by default)
|
Chris@16
|
461 * \tparam M3 type of the third matrix (not needed by default)
|
Chris@16
|
462 * \todo use opb_prod()
|
Chris@16
|
463 */
|
Chris@16
|
464 template<class M1, class T1, class T2, class M2, class M3>
|
Chris@16
|
465 M1 & sr2k (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3)
|
Chris@16
|
466 {
|
Chris@16
|
467 return m1 = t1 * m1 + t2 * (prod (m2, trans (m3)) + prod (m3, trans (m2)));
|
Chris@16
|
468 }
|
Chris@16
|
469
|
Chris@16
|
470 /** \brief generalized hermitian rank \a k update: * \f$m_1=t_1.m_1+t_2.(m_2.m_3^H)+(m_3.(t_2.m_2)^H)\f$
|
Chris@16
|
471 *
|
Chris@16
|
472 * \param m1 first matrix
|
Chris@16
|
473 * \param t1 first scalar
|
Chris@16
|
474 * \param t2 second scalar
|
Chris@16
|
475 * \param m2 second matrix
|
Chris@16
|
476 * \param m3 third matrix
|
Chris@16
|
477 * \return matrix \c m1
|
Chris@16
|
478 *
|
Chris@16
|
479 * \tparam M1 type of the first matrix (not needed by default)
|
Chris@16
|
480 * \tparam T1 type of the first scalar (not needed by default)
|
Chris@16
|
481 * \tparam T2 type of the second scalar (not needed by default)
|
Chris@16
|
482 * \tparam M2 type of the second matrix (not needed by default)
|
Chris@16
|
483 * \tparam M3 type of the third matrix (not needed by default)
|
Chris@16
|
484 * \todo use opb_prod()
|
Chris@16
|
485 */
|
Chris@16
|
486 template<class M1, class T1, class T2, class M2, class M3>
|
Chris@16
|
487 M1 & hr2k (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3)
|
Chris@16
|
488 {
|
Chris@16
|
489 return m1 =
|
Chris@16
|
490 t1 * m1
|
Chris@16
|
491 + t2 * prod (m2, herm (m3))
|
Chris@16
|
492 + type_traits<T2>::conj (t2) * prod (m3, herm (m2));
|
Chris@16
|
493 }
|
Chris@16
|
494
|
Chris@16
|
495 }
|
Chris@16
|
496
|
Chris@16
|
497 }}}
|
Chris@16
|
498
|
Chris@16
|
499 #endif
|