op_cov_meat.hpp
Go to the documentation of this file.
1 // Copyright (C) 2009-2011 NICTA (www.nicta.com.au)
2 // Copyright (C) 2009-2011 Conrad Sanderson
3 // Copyright (C) 2009-2010 Dimitrios Bouzas
4 //
5 // This file is part of the Armadillo C++ library.
6 // It is provided without any warranty of fitness
7 // for any purpose. You can redistribute this file
8 // and/or modify it under the terms of the GNU
9 // Lesser General Public License (LGPL) as published
10 // by the Free Software Foundation, either version 3
11 // of the License or (at your option) any later version.
12 // (see http://www.opensource.org/licenses for more info)
13 
14 
15 
18 
19 
20 
21 template<typename eT>
22 inline
23 void
24 op_cov::direct_cov(Mat<eT>& out, const Mat<eT>& A, const uword norm_type)
25  {
27 
28  if(A.is_vec())
29  {
30  if(A.n_rows == 1)
31  {
32  out = var(trans(A), norm_type);
33  }
34  else
35  {
36  out = var(A, norm_type);
37  }
38  }
39  else
40  {
41  const uword N = A.n_rows;
42  const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);
43 
44  const Row<eT> acc = sum(A);
45 
46  out = trans(A) * A;
47  out -= (trans(acc) * acc)/eT(N);
48  out /= norm_val;
49  }
50  }
51 
52 
53 
54 template<typename T>
55 inline
56 void
57 op_cov::direct_cov(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const uword norm_type)
58  {
60 
61  typedef typename std::complex<T> eT;
62 
63  if(A.is_vec())
64  {
65  if(A.n_rows == 1)
66  {
67  const Mat<T> tmp_mat = var(trans(A), norm_type);
68  out.set_size(1,1);
69  out[0] = tmp_mat[0];
70  }
71  else
72  {
73  const Mat<T> tmp_mat = var(A, norm_type);
74  out.set_size(1,1);
75  out[0] = tmp_mat[0];
76  }
77  }
78  else
79  {
80  const uword N = A.n_rows;
81  const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);
82 
83  const Row<eT> acc = sum(A);
84 
85  out = trans(A) * A; // out = strans(conj(A)) * A;
86  out -= (trans(acc) * acc)/eT(N); // out -= (strans(conj(acc)) * acc)/eT(N);
87  out /= norm_val;
88  }
89  }
90 
91 
92 
93 template<typename T1>
94 inline
95 void
97  {
99 
100  typedef typename T1::elem_type eT;
101 
102  const unwrap_check<T1> tmp(in.m, out);
103  const Mat<eT>& A = tmp.M;
104 
105  const uword norm_type = in.aux_uword_a;
106 
107  op_cov::direct_cov(out, A, norm_type);
108  }
109 
110 
111 
arma_inline const Op< T1, op_sum > sum(const Base< typename T1::elem_type, T1 > &X, const uword dim=0)
Delayed sum of elements of a matrix along a specified dimension (either rows or columns). The result is stored in a dense matrix that has either one column or one row. For dim = 0, find the sum of each column. For dim = 1, find the sum of each row. The default is dim = 0. NOTE: this function works differently than in Matlab/Octave.
Definition: fn_sum.hpp:29
arma_inline arma_warn_unused bool is_vec() const
returns true if the object can be interpreted as a column or row vector
Definition: Mat_meat.hpp:3824
const uword n_rows
number of rows in the matrix (read-only)
Definition: Mat_bones.hpp:29
arma_aligned const T1 & m
storage of reference to the operand (eg. a matrix)
Definition: Op_bones.hpp:45
u32 uword
Definition: typedef.hpp:85
arma_inline const Op< T1, op_htrans > trans(const Base< typename T1::elem_type, T1 > &X)
Definition: fn_trans.hpp:21
static void direct_cov(Mat< eT > &out, const Mat< eT > &X, const uword norm_type)
Definition: op_cov_meat.hpp:24
Class for row vectors (matrices with only one row)
#define arma_extra_debug_sigprint
Definition: debug.hpp:1116
Dense matrix class.
const mtOp< typename T1::pod_type, T1, op_var > var(const Base< typename T1::elem_type, T1 > &X, const uword norm_type=0, const uword dim=0)
Definition: fn_var.hpp:22
const Mat< eT > M
Definition: unwrap.hpp:142
arma_aligned uword aux_uword_a
storage of auxiliary data, uword format
Definition: Op_bones.hpp:47
static void apply(Mat< typename T1::elem_type > &out, const Op< T1, op_cov > &in)
Definition: op_cov_meat.hpp:96


armadillo_matrix
Author(s):
autogenerated on Fri Apr 16 2021 02:31:58