Chris@49: // Copyright (C) 2009-2011 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2009-2011 Conrad Sanderson Chris@49: // Copyright (C) 2009-2010 Dimitrios Bouzas 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: Chris@49: //! \addtogroup op_cov Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_cov::direct_cov(Mat& out, const Mat& A, const uword norm_type) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(A.is_vec()) Chris@49: { Chris@49: if(A.n_rows == 1) Chris@49: { Chris@49: out = var(trans(A), norm_type); Chris@49: } Chris@49: else Chris@49: { Chris@49: out = var(A, norm_type); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword N = A.n_rows; Chris@49: const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); Chris@49: Chris@49: const Row acc = sum(A); Chris@49: Chris@49: out = trans(A) * A; Chris@49: out -= (trans(acc) * acc)/eT(N); Chris@49: out /= norm_val; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_cov::direct_cov(Mat< std::complex >& out, const Mat< std::complex >& A, const uword norm_type) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename std::complex eT; Chris@49: Chris@49: if(A.is_vec()) Chris@49: { Chris@49: if(A.n_rows == 1) Chris@49: { Chris@49: const Mat tmp_mat = var(trans(A), norm_type); Chris@49: out.set_size(1,1); Chris@49: out[0] = tmp_mat[0]; Chris@49: } Chris@49: else Chris@49: { Chris@49: const Mat tmp_mat = var(A, norm_type); Chris@49: out.set_size(1,1); Chris@49: out[0] = tmp_mat[0]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword N = A.n_rows; Chris@49: const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); Chris@49: Chris@49: const Row acc = sum(A); Chris@49: Chris@49: out = trans(A) * A; // out = strans(conj(A)) * A; Chris@49: out -= (trans(acc) * acc)/eT(N); // out -= (strans(conj(acc)) * acc)/eT(N); Chris@49: out /= norm_val; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: op_cov::apply(Mat& out, const Op& in) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const unwrap_check tmp(in.m, out); Chris@49: const Mat& A = tmp.M; Chris@49: Chris@49: const uword norm_type = in.aux_uword_a; Chris@49: Chris@49: op_cov::direct_cov(out, A, norm_type); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}