Eurobot2012_Secondary

Fork of Eurobot_2012_Secondary by Shuto Naruse

Committer:
narshu
Date:
Wed Oct 17 22:25:31 2012 +0000
Revision:
1:cc2a9eb0bd55
Commit before publishing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
narshu 1:cc2a9eb0bd55 1 /*
narshu 1:cc2a9eb0bd55 2 * Tiny Vector Matrix Library
narshu 1:cc2a9eb0bd55 3 * Dense Vector Matrix Libary of Tiny size using Expression Templates
narshu 1:cc2a9eb0bd55 4 *
narshu 1:cc2a9eb0bd55 5 * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net>
narshu 1:cc2a9eb0bd55 6 *
narshu 1:cc2a9eb0bd55 7 * This library is free software; you can redistribute it and/or
narshu 1:cc2a9eb0bd55 8 * modify it under the terms of the GNU Lesser General Public
narshu 1:cc2a9eb0bd55 9 * License as published by the Free Software Foundation; either
narshu 1:cc2a9eb0bd55 10 * version 2.1 of the License, or (at your option) any later version.
narshu 1:cc2a9eb0bd55 11 *
narshu 1:cc2a9eb0bd55 12 * This library is distributed in the hope that it will be useful,
narshu 1:cc2a9eb0bd55 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
narshu 1:cc2a9eb0bd55 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
narshu 1:cc2a9eb0bd55 15 * Lesser General Public License for more details.
narshu 1:cc2a9eb0bd55 16 *
narshu 1:cc2a9eb0bd55 17 * You should have received a copy of the GNU Lesser General Public
narshu 1:cc2a9eb0bd55 18 * License along with this library; if not, write to the Free Software
narshu 1:cc2a9eb0bd55 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
narshu 1:cc2a9eb0bd55 20 *
narshu 1:cc2a9eb0bd55 21 * $Id: General.h,v 1.13 2007-06-23 15:58:59 opetzold Exp $
narshu 1:cc2a9eb0bd55 22 */
narshu 1:cc2a9eb0bd55 23
narshu 1:cc2a9eb0bd55 24 #ifndef TVMET_UTIL_GENERAL_H
narshu 1:cc2a9eb0bd55 25 #define TVMET_UTIL_GENERAL_H
narshu 1:cc2a9eb0bd55 26
narshu 1:cc2a9eb0bd55 27
narshu 1:cc2a9eb0bd55 28 /** forward */
narshu 1:cc2a9eb0bd55 29 namespace tvmet {
narshu 1:cc2a9eb0bd55 30 template<class T, std::size_t Rows, std::size_t Cols> class Matrix;
narshu 1:cc2a9eb0bd55 31 template<class T, std::size_t Sz> class Vector;
narshu 1:cc2a9eb0bd55 32 }
narshu 1:cc2a9eb0bd55 33
narshu 1:cc2a9eb0bd55 34 namespace tvmet {
narshu 1:cc2a9eb0bd55 35
narshu 1:cc2a9eb0bd55 36 namespace util {
narshu 1:cc2a9eb0bd55 37
narshu 1:cc2a9eb0bd55 38 /*
narshu 1:cc2a9eb0bd55 39 * \defgroup _util_function
narshu 1:cc2a9eb0bd55 40 * \brief Usefull utility functions
narshu 1:cc2a9eb0bd55 41 */
narshu 1:cc2a9eb0bd55 42
narshu 1:cc2a9eb0bd55 43 /**
narshu 1:cc2a9eb0bd55 44 * \fn Gemm(const Matrix<T, Rows, Cols>& m1, const Matrix<T, Rows, Cols>& m2, Matrix<T, Rows, Cols>& m3)
narshu 1:cc2a9eb0bd55 45 * \brief General matrix matrix multiplication using loops.
narshu 1:cc2a9eb0bd55 46 * \ingroup _util_function
narshu 1:cc2a9eb0bd55 47 */
narshu 1:cc2a9eb0bd55 48 template<class T, std::size_t Rows, std::size_t Cols>
narshu 1:cc2a9eb0bd55 49 inline
narshu 1:cc2a9eb0bd55 50 void
narshu 1:cc2a9eb0bd55 51 Gemm(const Matrix<T, Rows, Cols>& m1, const Matrix<T, Rows, Cols>& m2,
narshu 1:cc2a9eb0bd55 52 Matrix<T, Rows, Cols>& m3)
narshu 1:cc2a9eb0bd55 53 {
narshu 1:cc2a9eb0bd55 54 for (std::size_t i = 0; i < Rows; ++i) {
narshu 1:cc2a9eb0bd55 55 for (std::size_t j = 0; j < Cols; ++j) {
narshu 1:cc2a9eb0bd55 56 T sum(0);
narshu 1:cc2a9eb0bd55 57 for (std::size_t k = 0; k < Cols; ++k) {
narshu 1:cc2a9eb0bd55 58 sum += m1(i,k) * m2(k,j);
narshu 1:cc2a9eb0bd55 59 }
narshu 1:cc2a9eb0bd55 60 m3(i,j) = sum;
narshu 1:cc2a9eb0bd55 61 }
narshu 1:cc2a9eb0bd55 62 }
narshu 1:cc2a9eb0bd55 63 }
narshu 1:cc2a9eb0bd55 64
narshu 1:cc2a9eb0bd55 65
narshu 1:cc2a9eb0bd55 66 /**
narshu 1:cc2a9eb0bd55 67 * \fn Gemv(const Matrix<T, Rows, Cols>& m, const Vector<T, Cols>& v, Vector<T, Cols>& v2)
narshu 1:cc2a9eb0bd55 68 * \brief General matrix vector multiplication using loops.
narshu 1:cc2a9eb0bd55 69 * \ingroup _util_function
narshu 1:cc2a9eb0bd55 70 */
narshu 1:cc2a9eb0bd55 71 template<class T, std::size_t Rows, std::size_t Cols>
narshu 1:cc2a9eb0bd55 72 inline
narshu 1:cc2a9eb0bd55 73 void
narshu 1:cc2a9eb0bd55 74 Gemv(const Matrix<T, Rows, Cols>& m, const Vector<T, Cols>& v,
narshu 1:cc2a9eb0bd55 75 Vector<T, Cols>& v2)
narshu 1:cc2a9eb0bd55 76 {
narshu 1:cc2a9eb0bd55 77 for (std::size_t i = 0; i < Rows; ++i){
narshu 1:cc2a9eb0bd55 78 v2(i) = T(0); // clean up before use
narshu 1:cc2a9eb0bd55 79 for (std::size_t j = 0; j < Cols; ++j) {
narshu 1:cc2a9eb0bd55 80 v2(i) += m(i,j) * v(j);
narshu 1:cc2a9eb0bd55 81 }
narshu 1:cc2a9eb0bd55 82 }
narshu 1:cc2a9eb0bd55 83 }
narshu 1:cc2a9eb0bd55 84
narshu 1:cc2a9eb0bd55 85
narshu 1:cc2a9eb0bd55 86 /**
narshu 1:cc2a9eb0bd55 87 * \fn Gevvmul(const Vector<T, Sz>& v1, const Vector<T, Sz>& v2, Vector<T, Sz>& v3)
narshu 1:cc2a9eb0bd55 88 * \brief General vector vector elementwise multiplication using loop.
narshu 1:cc2a9eb0bd55 89 * \ingroup _util_function
narshu 1:cc2a9eb0bd55 90 */
narshu 1:cc2a9eb0bd55 91 template<class T, std::size_t Sz>
narshu 1:cc2a9eb0bd55 92 inline
narshu 1:cc2a9eb0bd55 93 void
narshu 1:cc2a9eb0bd55 94 Gevvmul(const Vector<T, Sz>& v1, const Vector<T, Sz>& v2,
narshu 1:cc2a9eb0bd55 95 Vector<T, Sz>& v3)
narshu 1:cc2a9eb0bd55 96 {
narshu 1:cc2a9eb0bd55 97 for(std::size_t i = 0; i < Sz; ++i)
narshu 1:cc2a9eb0bd55 98 v3(i) = v1(i) * v2(i);
narshu 1:cc2a9eb0bd55 99 }
narshu 1:cc2a9eb0bd55 100
narshu 1:cc2a9eb0bd55 101
narshu 1:cc2a9eb0bd55 102 /**
narshu 1:cc2a9eb0bd55 103 * \fn Gevvadd(const Vector<T, Sz>& v1, const Vector<T, Sz>& v2, Vector<T, Sz>& v3)
narshu 1:cc2a9eb0bd55 104 * \brief General vector vector elementwise multiplication using loop.
narshu 1:cc2a9eb0bd55 105 * \ingroup _util_function
narshu 1:cc2a9eb0bd55 106 */
narshu 1:cc2a9eb0bd55 107 template<class T, std::size_t Sz>
narshu 1:cc2a9eb0bd55 108 inline
narshu 1:cc2a9eb0bd55 109 void
narshu 1:cc2a9eb0bd55 110 Gevvadd(const Vector<T, Sz>& v1, const Vector<T, Sz>& v2,
narshu 1:cc2a9eb0bd55 111 Vector<T, Sz>& v3)
narshu 1:cc2a9eb0bd55 112 {
narshu 1:cc2a9eb0bd55 113 for(std::size_t i = 0; i < Sz; ++i)
narshu 1:cc2a9eb0bd55 114 v3(i) = v1(i) + v2(i);
narshu 1:cc2a9eb0bd55 115 }
narshu 1:cc2a9eb0bd55 116
narshu 1:cc2a9eb0bd55 117 } // namespace util
narshu 1:cc2a9eb0bd55 118
narshu 1:cc2a9eb0bd55 119 } // namespace tvmet
narshu 1:cc2a9eb0bd55 120
narshu 1:cc2a9eb0bd55 121 #endif // TVMET_UTIL_GENERAL_H
narshu 1:cc2a9eb0bd55 122
narshu 1:cc2a9eb0bd55 123 // Local Variables:
narshu 1:cc2a9eb0bd55 124 // mode:C++
narshu 1:cc2a9eb0bd55 125 // tab-width:8
narshu 1:cc2a9eb0bd55 126 // End: