34#define _USE_MATH_DEFINES
42#define M_PI 3.14159265358979323846
61 template <
class T,
size_t... Dims>
64 return double(
sum(arr)) / arr.fsize();
75 template <
class T,
size_t... Dims>
80 arr.for_each([&](
const T &x)
82 double d = double(x) - m;
84 return sq_sum / (arr.fsize() - (
sample ? 1 : 0));
95 template <
class T,
size_t... Dims>
110 template <
class T,
size_t N>
113 return std::inner_product(a.fbegin(), a.fend(), b.fbegin(),
T{});
123 template <
class T,
size_t N>
126 return std::sqrt(
double(
dot(a, a)));
137 template <
class T,
size_t N>
150 template <
class T,
size_t N>
153 double len =
norm(a);
157 auto ai = a.fbegin();
158 auto ri = result.fbegin();
159 while (ri != result.fend())
172 template <
class T,
size_t N>
176 auto ai = a.fbegin();
177 auto bi = b.fbegin();
178 while (ai != a.fend())
180 double d = *ai++ - *bi++;
183 return std::sqrt(
sum);
194 template <
class T,
size_t N>
198 auto ai = a.fbegin();
199 auto bi = b.fbegin();
200 while (ai != a.fend())
201 sum += std::abs(*ai++ - *bi++);
216 template <
class T,
size_t M,
size_t N,
size_t K>
221 for (
size_t i = 0; i <
M; ++i)
222 for (
size_t j = 0; j <
N; ++j)
223 for (
size_t k = 0; k <
K; ++k)
224 C[i][k] +=
A[i][j] *
B[j][k];
236 template <
class T,
size_t M,
size_t N>
240 for (
size_t i = 0; i <
M; i++)
241 for (
size_t j = 0; j <
N; j++)
252 template <
class T,
size_t N>
256 for (
size_t i = 0; i <
N; i++)
268 template <
class T,
size_t N>
272 for (
size_t i = 0; i <
N; i++)
288 a[1] * b[2] - a[2] * b[1],
289 a[2] * b[0] - a[0] * b[2],
290 a[0] * b[1] - a[1] * b[0]};
303 template <
class T,
size_t... Dims>
308 auto ri = result.fbegin();
309 auto ai = arr.fbegin();
310 while (ri != result.fend())
312 *ri = *ai < low ? low : (*ai > high ? high : *ai);
326 template <
class T,
size_t... Dims>
330 auto ri = result.fbegin();
331 auto ai = arr.fbegin();
332 while (ri != result.fend())
333 *ri++ = std::abs(*ai++);
346 template <
class T,
size_t... Dims>
350 arr.for_each([&](
T &x)
362 template <
class T,
size_t... Dims>
365 std::normal_distribution<T> dis(
mean,
stddev);
366 arr.for_each([&](
T &x)
378 template <
class T,
size_t... Dims>
381 size_t n = arr.fsize();
382 for (
size_t i = 0; i < n; i++)
383 arr.fbegin()[i] = start + (end - start) * i / (n - 1);
394 template <
class T,
size_t... Dims>
397 return std::accumulate(arr.fbegin(), arr.fend(),
T{1}, std::multiplies<T>());
408 template <
class T,
size_t... Dims>
411 if (k >= arr.fsize())
413 std::nth_element(arr.fbegin(), arr.fbegin() + k, arr.fend());
414 return arr.fbegin()[k];
426 template <
class T,
size_t N,
size_t K>
431 for (
size_t i = 0; i <
N; i++)
432 for (
size_t j = 0; j <
K; j++)
433 result[i + j] += signal[i] * kernel[j];
445 template <
class T,
size_t... Dims>
449 auto ri = result.fbegin();
450 auto ai = arr.fbegin();
451 while (ri != result.fend())
452 *ri++ = std::sin(*ai++);
463 template <
class T,
size_t... Dims>
467 auto ri = result.fbegin();
468 auto ai = arr.fbegin();
469 while (ri != result.fend())
470 *ri++ = std::cos(*ai++);
481 template <
class T,
size_t... Dims>
485 auto ri = result.fbegin();
486 auto ai = arr.fbegin();
487 while (ri != result.fend())
488 *ri++ = std::tan(*ai++);
499 template <
class T,
size_t... Dims>
503 auto ri = result.fbegin();
504 auto ai = arr.fbegin();
505 while (ri != result.fend())
506 *ri++ = std::asin(*ai++);
517 template <
class T,
size_t... Dims>
521 auto ri = result.fbegin();
522 auto ai = arr.fbegin();
523 while (ri != result.fend())
524 *ri++ = std::acos(*ai++);
535 template <
class T,
size_t... Dims>
539 auto ri = result.fbegin();
540 auto ai = arr.fbegin();
541 while (ri != result.fend())
542 *ri++ = std::atan(*ai++);
553 template <
class T,
size_t... Dims>
557 auto ri = result.fbegin();
558 auto ai = arr.fbegin();
559 while (ri != result.fend())
560 *ri++ = std::sinh(*ai++);
571 template <
class T,
size_t... Dims>
575 auto ri = result.fbegin();
576 auto ai = arr.fbegin();
577 while (ri != result.fend())
578 *ri++ = std::cosh(*ai++);
589 template <
class T,
size_t... Dims>
593 auto ri = result.fbegin();
594 auto ai = arr.fbegin();
595 while (ri != result.fend())
596 *ri++ = std::tanh(*ai++);
608 template <
class T,
size_t... Dims>
612 auto ri = result.fbegin();
613 auto ai = arr.fbegin();
614 while (ri != result.fend())
615 *ri++ = std::exp(*ai++);
626 template <
class T,
size_t... Dims>
630 auto ri = result.fbegin();
631 auto ai = arr.fbegin();
632 while (ri != result.fend())
633 *ri++ = std::log(*ai++);
644 template <
class T,
size_t... Dims>
648 auto ri = result.fbegin();
649 auto ai = arr.fbegin();
650 while (ri != result.fend())
651 *ri++ = std::log10(*ai++);
663 template <
class T,
size_t... Dims>
667 auto ri = result.fbegin();
668 auto ai = arr.fbegin();
669 while (ri != result.fend())
670 *ri++ = std::pow(*ai++, exponent);
682 template <
class T,
size_t... Dims>
687 auto bi = base.fbegin();
688 auto ei =
exp.fbegin();
689 auto ri = result.fbegin();
690 while (ri != result.fend())
691 *ri++ = std::pow(*bi++, *ei++);
703 template <
class T,
size_t... Dims>
707 auto ri = result.fbegin();
708 auto ai = arr.fbegin();
709 while (ri != result.fend())
710 *ri++ = std::floor(*ai++);
721 template <
class T,
size_t... Dims>
725 auto ri = result.fbegin();
726 auto ai = arr.fbegin();
727 while (ri != result.fend())
728 *ri++ = std::ceil(*ai++);
739 template <
class T,
size_t... Dims>
743 auto ri = result.fbegin();
744 auto ai = arr.fbegin();
745 while (ri != result.fend())
746 *ri++ = std::round(*ai++);
758 template <
class T,
size_t... Dims>
762 const char *name =
"")
765 os <<
"=== " << name <<
" ===" <<
'\n';
766 os <<
" sum : " <<
sum(arr) <<
'\n';
767 os <<
" mean : " <<
mean(arr) <<
'\n';
768 os <<
" min : " <<
min(arr) <<
'\n';
769 os <<
" max : " <<
max(arr) <<
'\n';
770 os <<
" stddev: " <<
stddev(arr) << std::endl;
编译期固定维度的多维数组。
Definition multiarray.h:57
T min(const MultiArray< T, Dims... > &a)
求最小值。
Definition multiarray.h:1551
T max(const MultiArray< T, Dims... > &a)
求最大值。
Definition multiarray.h:1561
T sum(const MultiArray< T, Dims... > &a)
求和所有元素。
Definition multiarray.h:1538
auto sample(C &&c, size_t size, bool replace=false, std::mt19937 &gen=default_gen()) -> std::vector< typename std::iterator_traits< decltype(std::begin(c))>::value_type >
从容器中随机抽取指定数量的元素(有放回或无放回)。
Definition random.h:418
std::mt19937 & default_gen()
获取一个全局的、以当前时间戳为种子的 Mersenne Twister 随机数引擎。
Definition random.h:54
typename uniform_distribution_impl< T >::type uniform_distribution_t
取得对印类型所对应的均匀分布。
Definition sfinae.h:381
提供编译期维度固定的多维数组容器 MultiArray,支持任意维度和元素级算术/逻辑/位运算。