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

1 year 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.reverse(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. }