annotate armadillo-3.900.4/include/armadillo_bits/glue_histc_meat.hpp @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
Chris@49 1 // Copyright (C) 2012-2013 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2012-2013 Conrad Sanderson
Chris@49 3 // Copyright (C) 2012 Boris Sabanin
Chris@49 4 //
Chris@49 5 // This Source Code Form is subject to the terms of the Mozilla Public
Chris@49 6 // License, v. 2.0. If a copy of the MPL was not distributed with this
Chris@49 7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
Chris@49 8
Chris@49 9
Chris@49 10
Chris@49 11 template<typename T1, typename T2>
Chris@49 12 inline
Chris@49 13 void
Chris@49 14 glue_histc::apply(Mat<uword>& out, const mtGlue<uword,T1,T2,glue_histc>& in)
Chris@49 15 {
Chris@49 16 arma_extra_debug_sigprint();
Chris@49 17
Chris@49 18 typedef typename T1::elem_type eT;
Chris@49 19
Chris@49 20 const uword dim = in.aux_uword;
Chris@49 21
Chris@49 22 const unwrap_check_mixed<T1> tmp1(in.A, out);
Chris@49 23 const unwrap_check_mixed<T2> tmp2(in.B, out);
Chris@49 24
Chris@49 25 const Mat<eT>& X = tmp1.M;
Chris@49 26 const Mat<eT>& E = tmp2.M;
Chris@49 27
Chris@49 28 arma_debug_check
Chris@49 29 (
Chris@49 30 ((E.is_vec() == false) && (E.is_empty() == false)),
Chris@49 31 "histc(): parameter 'edges' must be a vector"
Chris@49 32 );
Chris@49 33
Chris@49 34 arma_debug_check
Chris@49 35 (
Chris@49 36 (dim > 1),
Chris@49 37 "histc(): parameter 'dim' must be 0 or 1"
Chris@49 38 );
Chris@49 39
Chris@49 40 const uword X_n_elem = X.n_elem;
Chris@49 41 const uword X_n_rows = X.n_rows;
Chris@49 42 const uword X_n_cols = X.n_cols;
Chris@49 43
Chris@49 44 const uword E_n_elem = E.n_elem;
Chris@49 45
Chris@49 46 if( E_n_elem == 0 )
Chris@49 47 {
Chris@49 48 out.reset();
Chris@49 49 return;
Chris@49 50 }
Chris@49 51
Chris@49 52
Chris@49 53 // for vectors we are currently ignoring the "dim" parameter
Chris@49 54
Chris@49 55 uword out_n_rows = 0;
Chris@49 56 uword out_n_cols = 0;
Chris@49 57
Chris@49 58 if(X.is_vec())
Chris@49 59 {
Chris@49 60 if(X.is_rowvec())
Chris@49 61 {
Chris@49 62 out_n_rows = 1;
Chris@49 63 out_n_cols = E_n_elem;
Chris@49 64 }
Chris@49 65 else
Chris@49 66 if(X.is_colvec())
Chris@49 67 {
Chris@49 68 out_n_rows = E_n_elem;
Chris@49 69 out_n_cols = 1;
Chris@49 70 }
Chris@49 71 }
Chris@49 72 else
Chris@49 73 {
Chris@49 74 if(dim == 0)
Chris@49 75 {
Chris@49 76 out_n_rows = E_n_elem;
Chris@49 77 out_n_cols = X_n_cols;
Chris@49 78 }
Chris@49 79 else
Chris@49 80 if(dim == 1)
Chris@49 81 {
Chris@49 82 out_n_rows = X_n_rows;
Chris@49 83 out_n_cols = E_n_elem;
Chris@49 84 }
Chris@49 85 }
Chris@49 86
Chris@49 87 out.zeros(out_n_rows, out_n_cols);
Chris@49 88
Chris@49 89 const eT* E_mem = E.memptr();
Chris@49 90
Chris@49 91 if(X.is_vec() == true)
Chris@49 92 {
Chris@49 93 uword* out_mem = out.memptr();
Chris@49 94 const eT* X_mem = X.memptr();
Chris@49 95
Chris@49 96 for(uword j=0; j<X_n_elem; ++j)
Chris@49 97 {
Chris@49 98 const eT val = X_mem[j];
Chris@49 99
Chris@49 100 for(uword i=0; i<E_n_elem-1; ++i)
Chris@49 101 {
Chris@49 102 if( (E_mem[i] <= val) && (val < E_mem[i+1]) )
Chris@49 103 {
Chris@49 104 out_mem[i]++;
Chris@49 105 break;
Chris@49 106 }
Chris@49 107 else
Chris@49 108 if(val == E_mem[E_n_elem-1])
Chris@49 109 {
Chris@49 110 // in general, the above == operation doesn't make sense for floating point values (due to precision issues),
Chris@49 111 // but is included for compatibility with Matlab and Octave.
Chris@49 112 // Matlab folks must have been smoking something strong.
Chris@49 113 out_mem[E_n_elem-1]++;
Chris@49 114 break;
Chris@49 115 }
Chris@49 116 }
Chris@49 117 }
Chris@49 118 }
Chris@49 119 else
Chris@49 120 if(dim == 0)
Chris@49 121 {
Chris@49 122 for(uword col=0; col<X_n_cols; ++col)
Chris@49 123 {
Chris@49 124 uword* out_coldata = out.colptr(col);
Chris@49 125 const eT* X_coldata = X.colptr(col);
Chris@49 126
Chris@49 127 for(uword row=0; row<X_n_rows; ++row)
Chris@49 128 {
Chris@49 129 const eT val = X_coldata[row];
Chris@49 130
Chris@49 131 for(uword i=0; i<E_n_elem-1; ++i)
Chris@49 132 {
Chris@49 133 if( (E_mem[i] <= val) && (val < E_mem[i+1]) )
Chris@49 134 {
Chris@49 135 out_coldata[i]++;
Chris@49 136 break;
Chris@49 137 }
Chris@49 138 else
Chris@49 139 if(val == E_mem[E_n_elem-1])
Chris@49 140 {
Chris@49 141 out_coldata[E_n_elem-1]++;
Chris@49 142 break;
Chris@49 143 }
Chris@49 144 }
Chris@49 145 }
Chris@49 146 }
Chris@49 147 }
Chris@49 148 else
Chris@49 149 if(dim == 1)
Chris@49 150 {
Chris@49 151 for(uword row=0; row<X_n_rows; ++row)
Chris@49 152 {
Chris@49 153 for(uword col=0; col<X_n_cols; ++col)
Chris@49 154 {
Chris@49 155 const eT val = X.at(row,col);
Chris@49 156
Chris@49 157 for(uword i=0; i<E_n_elem-1; ++i)
Chris@49 158 {
Chris@49 159 if( (E_mem[i] <= val) && (val < E_mem[i+1]) )
Chris@49 160 {
Chris@49 161 out.at(row,i)++;
Chris@49 162 break;
Chris@49 163 }
Chris@49 164 else
Chris@49 165 if(val == E_mem[E_n_elem-1])
Chris@49 166 {
Chris@49 167 out.at(row,E_n_elem-1)++;
Chris@49 168 break;
Chris@49 169 }
Chris@49 170 }
Chris@49 171 }
Chris@49 172 }
Chris@49 173 }
Chris@49 174 }