/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Copyright 2011-2015 Danny Robson */ #ifdef __UTIL_MATRIX_IPP #error #endif #define __UTIL_MATRIX_IPP /////////////////////////////////////////////////////////////////////////////// template T* util::matrix::operator[] (size_t idx) { return this->values[idx]; } //----------------------------------------------------------------------------- template const T* util::matrix::operator[] (size_t idx) const { return this->values[idx]; } //----------------------------------------------------------------------------- template const T* util::matrix::begin (void) const { return &(*this)[0][0]; } //----------------------------------------------------------------------------- template const T* util::matrix::end (void) const { return &(*this)[S][0]; } //----------------------------------------------------------------------------- template const T* util::matrix::cbegin (void) const { return begin (); } //----------------------------------------------------------------------------- template const T* util::matrix::cend (void) const { return end (); } //----------------------------------------------------------------------------- template T* util::matrix::begin (void) { return &(*this)[0][0]; } //----------------------------------------------------------------------------- template T* util::matrix::end (void) { return &(*this)[S][0]; } /////////////////////////////////////////////////////////////////////////////// template template util::matrix util::matrix::cast (void) const { util::matrix out; std::copy (cbegin (), cend (), std::begin (out)); return out; } /////////////////////////////////////////////////////////////////////////////// #define MATRIX_ELEMENT_OP(OP) \ template \ constexpr \ util::matrix \ util::operator OP ( \ const util::matrix &a, \ const util::matrix &b) \ { \ util::matrix res {}; \ \ for (size_t i = 0; i < a.rows; ++i) \ for (size_t j = 0; j < a.cols; ++j) \ res[i][j] = a[i][j] OP b[i][j]; \ \ return res; \ } MATRIX_ELEMENT_OP(-) MATRIX_ELEMENT_OP(+) #undef MATRIX_ELEMENT_OP /////////////////////////////////////////////////////////////////////////////// #define MATRIX_SCALAR_OP(OP) \ template \ constexpr \ util::matrix \ util::operator OP (const util::matrix &m, const T t) \ { \ util::matrix res {}; \ \ std::transform ( \ std::cbegin (m), \ std::cend (m), \ std::begin (res), \ [&t] (auto x) { return x OP t; } \ ); \ \ return res; \ } \ \ \ template \ constexpr \ util::matrix \ util::operator OP (const T t, const util::matrix &m) \ { \ return m OP t; \ } \ \ \ template \ constexpr \ util::matrix& \ util::operator OP##= (util::matrix &m, T t) \ { \ std::transform ( \ std::cbegin (m), \ std::cend (m), \ std::begin (m), \ [&t] (auto x) { return x OP t; } \ ); \ \ return m; \ } MATRIX_SCALAR_OP(*) MATRIX_SCALAR_OP(/) MATRIX_SCALAR_OP(+) MATRIX_SCALAR_OP(-) #undef MATRIX_SCALAR_OP /////////////////////////////////////////////////////////////////////////////// template constexpr util::matrix util::matrix::zeroes (void) { return {0}; } /////////////////////////////////////////////////////////////////////////////// template constexpr util::matrix util::matrix::identity (void) { auto m = zeroes (); for (size_t i = 0; i < S; ++i) m[i][i] = 1; return m; } /////////////////////////////////////////////////////////////////////////////// template constexpr bool util::operator== (const matrix &a, const matrix &b) { return std::equal (std::cbegin (a), std::cend (a), std::cbegin (b)); } //----------------------------------------------------------------------------- template constexpr bool util::operator!= (const matrix &a, const matrix &b) { return !(a == b); } /////////////////////////////////////////////////////////////////////////////// template util::matrix util::abs (const util::matrix &src) { util::matrix dst; std::transform (std::cbegin (src), std::cend (src), std::begin (dst), util::abs); return dst; } /////////////////////////////////////////////////////////////////////////////// template constexpr T util::sum (const util::matrix &src) { return sum (std::cbegin (src), std::cend (src)); }