// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // 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. // ------------------------------------------------------------------------ //! \addtogroup op_cov //! @{ template inline void op_cov::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword norm_type = in.aux_uword_a; const unwrap U(in.m); const Mat& A = U.M; if(A.n_elem == 0) { out.reset(); return; } const Mat& AA = (A.n_rows == 1) ? Mat(const_cast(A.memptr()), A.n_cols, A.n_rows, false, false) : Mat(const_cast(A.memptr()), A.n_rows, A.n_cols, false, false); const uword N = AA.n_rows; const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); const Mat tmp = AA.each_row() - mean(AA,0); out = tmp.t() * tmp; out /= norm_val; } template inline void op_cov::apply(Mat& out, const Op< Op, op_cov>& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword norm_type = in.aux_uword_a; if(is_cx::yes) { const Mat tmp = in.m; // force the evaluation of Op out = cov(tmp, norm_type); } else { const unwrap U(in.m.m); const Mat& A = U.M; if(A.n_elem == 0) { out.reset(); return; } const Mat& AA = (A.n_cols == 1) ? Mat(const_cast(A.memptr()), A.n_cols, A.n_rows, false, false) : Mat(const_cast(A.memptr()), A.n_rows, A.n_cols, false, false); const uword N = AA.n_cols; const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); const Mat tmp = AA.each_col() - mean(AA,1); out = tmp * tmp.t(); out /= norm_val; } } //! @}