You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ops.h 2.6 kB

11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #pragma once
  2. #include <cmath>
  3. #include <functional>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <stdexcept>
  7. #include <numeric>
  8. namespace operators {
  9. template<typename T>
  10. T mul(T a, T b) {
  11. return a * b; // 请修改这里的return语句.
  12. }
  13. template<typename T>
  14. T id(T a) {
  15. return a; // 请修改这里的return语句
  16. }
  17. template<typename T>
  18. T add(T a, T b) {
  19. return a+b; // 请修改这里的return语句
  20. }
  21. template<typename T>
  22. T neg(T a) {
  23. return -a; // 请修改这里的return语句
  24. }
  25. template<typename T>
  26. float lt(T a, T b) {
  27. return (float)(a<b); // 请修改这里的return语句
  28. }
  29. template<typename T>
  30. float eq(T a, T b) {
  31. return (float)(a==b); // 请修改这里的return语句
  32. }
  33. template<typename T>
  34. T max(T a, T b) {
  35. return a>b?a:b; // 请修改这里的return语句
  36. }
  37. template<typename T, typename F>
  38. auto map(const std::vector<T>& vec, F func) -> std::vector<decltype(func(std::declval<T>()))> {
  39. std::vector<decltype(func(std::declval<T>()))> result;
  40. result.reserve(vec.size());
  41. std::transform(vec.begin(), vec.end(), std::back_inserter(result), func);
  42. return result;
  43. }
  44. template <typename T1, typename T2, typename F>
  45. auto zipWith(const std::vector<T1>& vec1, const std::vector<T2>& vec2, F func)
  46. -> std::vector<decltype(func(std::declval<T1>(), std::declval<T2>()))> {
  47. using ResultType = decltype(func(std::declval<T1>(),std::declval<T2>()));
  48. std::vector<ResultType> result;
  49. if (vec1.size() != vec2.size()) {
  50. // 我们已经在这里throw一个异常
  51. throw std::invalid_argument("Vectors must have the same size");
  52. }
  53. result.reserve(vec1.size());
  54. for(size_t i=0;i<vec1.size();++i){
  55. result.push_back(func(vec1[i],vec2[i]));
  56. }
  57. // 请在这里补全其他部分
  58. // 提醒:可以使用push_back函数向vector添加元素
  59. // 再给你降一点难度:这里需要仿照map函数神明一个result变量。
  60. return result; // 这里记得改掉,改成result
  61. }
  62. template<typename T, typename F>
  63. auto reduce(const std::vector<T>& vec, T init, F func) -> T {
  64. return std::accumulate(vec.begin(), vec.end(), init, func);
  65. }
  66. float is_close(float x, float y);
  67. float sigmoid(float x);
  68. float relu(float x);
  69. float inv(float x);
  70. float inv_back(float x, float d);
  71. float relu_back(float x, float d);
  72. auto sumList(const std::vector<float>& vec) -> float;
  73. auto prodList(const std::vector<float>& vec) -> float;
  74. auto addLists(const std::vector<float>& vec1, const std::vector<float>& vec2) -> std::vector<float>;
  75. auto negList(const std::vector<float>& vec) -> std::vector<float>;
  76. }