8 #ifndef SIG_UTIL_STATIC_UTIL_HPP
9 #define SIG_UTIL_STATIC_UTIL_HPP
11 #include "../calculation/for_each.hpp"
34 template <
class R =
void,
class C =
void>
35 auto sum(C
const& data)
40 return std::accumulate(
std::begin(data),
std::end(data), static_cast<RT>(0), std::plus<RT>{});
58 template <
class R =
void,
class C =
void,
class Pred =
void>
59 auto sum(C
const& data, Pred
const& access_func)
65 return std::accumulate(
std::begin(data),
std::end(data), static_cast<RT>(0), [&](RT
sum, T
const& e){
return sum + access_func(e); });
83 template <
class R =
void,
class CC =
void>
84 auto sum_row(CC
const& matrix, uint index)
86 assert(index < matrix.size());
87 return sum<R>(matrix[index]);
105 template <
class R =
void,
class CC =
void>
110 return sum<R>(matrix, [index](T
const& row){ assert(index < row.size());
return row[index]; });
130 template <
class R =
void,
class C =
void>
136 return std::accumulate(
std::begin(data),
std::end(data), static_cast<RT>(1), std::multiplies<RT>{});
154 template <
class R =
void,
class C =
void,
class Pred =
void>
155 auto product(C
const& data, Pred
const& access_func)
161 return std::accumulate(
std::begin(data),
std::end(data), static_cast<RT>(1), [&](RT
sum, T
const& e){
return sum * access_func(e); });
179 template <
class R =
void,
class CC =
void>
182 assert(index < matrix.size());
183 return product<R>(matrix[index]);
201 template <
class R =
void,
class CC =
void>
206 return product<R>(matrix, [index](T
const& row){ assert(index < row.size());
return row[index]; });
225 return static_cast<double>(sum<double>(data)) / data.size();
246 return std::accumulate(
std::begin(data),
std::end(data), 0.0, [mean](
double sum, T e){
return sum + std::pow(e - mean, 2); }) / data.size();
265 template <class C, typename std::enable_if<std::is_floating_point<typename impl::container_traits<C>::value_type>::value>::type*& =
enabler>
274 if (e < min) min = e;
275 else if (e > max) max = e;
278 for_each([min, max, diff](T& e){ e = (e -
min) / (diff); }, data);
302 template <
class R =
double,
class C =
void>
308 auto result = sig::copy<RT>(data);
330 template <class C, typename std::enable_if<std::is_floating_point<typename impl::container_traits<C>::value_type>::value>::type*& =
enabler>
338 for_each([mean, var](T& e){ e = (e - mean) / var; }, data);
362 template <
class R =
double,
class C =
void>
368 auto result = sig::copy<RT>(data);
392 typename std::enable_if<std::is_floating_point<typename impl::container_traits<C>::value_type>::value>::type*& =
enabler
397 for (
auto& e : data) e /=
sum;
421 template <
class R =
double,
class C =
void>
427 auto result = sig::copy<RT>(data);
void for_each(F &&func, Cs &&...containers)
複数コンテナを反復処理
auto sum_row(CC const &matrix, uint index)
行列の指定行の総和
bool normalize(C &data)
正規化(Normalization)
auto end(C &&c) -> std::move_iterator< typename RC::iterator >
auto product_row(CC const &matrix, uint index)
行列の指定行の総乗
double variance(C const &data)
分散
double average(C const &data)
平均
auto product_col(CC const &matrix, uint index)
行列の指定列の総乗
bool standardize(C &data)
標準化(Standardization)
auto sum_col(CC const &matrix, uint index)
行列の指定列の総和
auto product(C const &data) -> typename impl::SameIf< R, void, typename impl::container_traits< C >::value_type, R >::type
総乗
bool normalize_dist(C &data)
確率分布の正規化
auto sum(C const &data) -> typename impl::SameIf< R, void, typename impl::container_traits< C >::value_type, R >::type
総和
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >