Chris@49: // Copyright (C) 2011-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2011-2013 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup Gen Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: GenCube::GenCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices) Chris@49: : n_rows (in_n_rows ) Chris@49: , n_cols (in_n_cols ) Chris@49: , n_slices(in_n_slices) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: GenCube::~GenCube() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: GenCube::generate() Chris@49: { Chris@49: if(is_same_type::value == true) { return eT(1); } Chris@49: else if(is_same_type::value == true) { return eT(0); } Chris@49: else if(is_same_type::value == true) { return eT(eop_aux_randu()); } Chris@49: else if(is_same_type::value == true) { return eT(eop_aux_randn()); } Chris@49: else { return eT(); } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: GenCube::operator[](const uword) const Chris@49: { Chris@49: return GenCube::generate(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: GenCube::at(const uword, const uword, const uword) const Chris@49: { Chris@49: return GenCube::generate(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: GenCube::at_alt(const uword) const Chris@49: { Chris@49: return GenCube::generate(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: GenCube::apply(Cube& out) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: // NOTE: we're assuming that the cube has already been set to the correct size; Chris@49: // this is done by either the Cube contructor or operator=() Chris@49: Chris@49: if(is_same_type::value == true) { out.ones(); } Chris@49: else if(is_same_type::value == true) { out.zeros(); } Chris@49: else if(is_same_type::value == true) { out.randu(); } Chris@49: else if(is_same_type::value == true) { out.randn(); } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: GenCube::apply_inplace_plus(Cube& out) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "addition"); Chris@49: Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: uword i,j; Chris@49: Chris@49: for(i=0, j=1; j::generate(); Chris@49: const eT tmp_j = GenCube::generate(); Chris@49: Chris@49: out_mem[i] += tmp_i; Chris@49: out_mem[j] += tmp_j; Chris@49: } Chris@49: Chris@49: if(i < n_elem) Chris@49: { Chris@49: out_mem[i] += GenCube::generate(); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: GenCube::apply_inplace_minus(Cube& out) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "subtraction"); Chris@49: Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: uword i,j; Chris@49: Chris@49: for(i=0, j=1; j::generate(); Chris@49: const eT tmp_j = GenCube::generate(); Chris@49: Chris@49: out_mem[i] -= tmp_i; Chris@49: out_mem[j] -= tmp_j; Chris@49: } Chris@49: Chris@49: if(i < n_elem) Chris@49: { Chris@49: out_mem[i] -= GenCube::generate(); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: GenCube::apply_inplace_schur(Cube& out) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise multiplication"); Chris@49: Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: uword i,j; Chris@49: Chris@49: for(i=0, j=1; j::generate(); Chris@49: const eT tmp_j = GenCube::generate(); Chris@49: Chris@49: out_mem[i] *= tmp_i; Chris@49: out_mem[j] *= tmp_j; Chris@49: } Chris@49: Chris@49: if(i < n_elem) Chris@49: { Chris@49: out_mem[i] *= GenCube::generate(); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: GenCube::apply_inplace_div(Cube& out) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise division"); Chris@49: Chris@49: Chris@49: eT* out_mem = out.memptr(); Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: uword i,j; Chris@49: Chris@49: for(i=0, j=1; j::generate(); Chris@49: const eT tmp_j = GenCube::generate(); Chris@49: Chris@49: out_mem[i] /= tmp_i; Chris@49: out_mem[j] /= tmp_j; Chris@49: } Chris@49: Chris@49: if(i < n_elem) Chris@49: { Chris@49: out_mem[i] /= GenCube::generate(); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: //! @}