annotate DEPENDENCIES/generic/include/boost/numeric/ublas/blas.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
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