Browse Source

Merge pull request 'task01' (#9) from caojiyun24/uc-modern-cpp-student:master into master

test 1
master
PREScode 11 months ago
parent
commit
fe72d33474
2 changed files with 23 additions and 17 deletions
  1. +10
    -9
      cc/operators/ops.cc
  2. +13
    -8
      cc/operators/ops.h

+ 10
- 9
cc/operators/ops.cc View File

@@ -5,32 +5,33 @@ static float epsilon = 1e-6;


float is_close(float x, float y) { float is_close(float x, float y) {
// 请修改这里的return语句 // 请修改这里的return语句
return 0.0;
return (float)(abs(x-y)<epsilon);
} }


float sigmoid(float x) { float sigmoid(float x) {
// 请修改这里的return语句 // 请修改这里的return语句
return 0.0;
if(x>=0) return 1.0/(1.0+exp(-x));
else return exp(x)/(1.0+exp(x));
} }


float relu(float x) { float relu(float x) {
// 请修改这里的return语句 // 请修改这里的return语句
return 0.0;
return x>0.0?x:0.0;
} }


float inv(float x) { float inv(float x) {
// 请修改这里的return语句 // 请修改这里的return语句
return 0.0;
return 1.0/x;
} }


float inv_back(float x, float d) { float inv_back(float x, float d) {
// 请修改这里的return语句 // 请修改这里的return语句
return 0.0;
return -d/(x*x);
} }


float relu_back(float x, float d) { float relu_back(float x, float d) {
// 请修改这里的return语句 // 请修改这里的return语句
return 0.0;
return x>0.0?d*1.0:0.0;
} }


auto sumList(const std::vector<float>& vec) -> float { auto sumList(const std::vector<float>& vec) -> float {
@@ -39,16 +40,16 @@ auto sumList(const std::vector<float>& vec) -> float {


auto prodList(const std::vector<float>& vec) -> float { auto prodList(const std::vector<float>& vec) -> float {
// 请修改这里的return语句 // 请修改这里的return语句
return 0.0f;
return reduce(vec, 1.0f, mul<float>);
} }


auto addLists(const std::vector<float>& vec1, const std::vector<float>& vec2) -> std::vector<float> { auto addLists(const std::vector<float>& vec1, const std::vector<float>& vec2) -> std::vector<float> {
// 请修改这里的return语句 // 请修改这里的return语句
return std::vector<float>(1, 0.0f);
return zipWith(vec1, vec2, add<float>);
} }


auto negList(const std::vector<float>& vec) -> std::vector<float> { auto negList(const std::vector<float>& vec) -> std::vector<float> {
// 请修改这里的return语句 // 请修改这里的return语句
return std::vector<float>(1, 0.0f);
return map(vec,neg<float>);
} }
} }

+ 13
- 8
cc/operators/ops.h View File

@@ -15,32 +15,32 @@ T mul(T a, T b) {


template<typename T> template<typename T>
T id(T a) { T id(T a) {
return 0; // 请修改这里的return语句
return a; // 请修改这里的return语句
} }


template<typename T> template<typename T>
T add(T a, T b) { T add(T a, T b) {
return 0; // 请修改这里的return语句
return a+b; // 请修改这里的return语句
} }


template<typename T> template<typename T>
T neg(T a) { T neg(T a) {
return 0; // 请修改这里的return语句
return -a; // 请修改这里的return语句
} }


template<typename T> template<typename T>
float lt(T a, T b) { float lt(T a, T b) {
return 0.0; // 请修改这里的return语句
return (float)(a<b); // 请修改这里的return语句
} }


template<typename T> template<typename T>
float eq(T a, T b) { float eq(T a, T b) {
return 0.0; // 请修改这里的return语句
return (float)(a==b); // 请修改这里的return语句
} }


template<typename T> template<typename T>
T max(T a, T b) { T max(T a, T b) {
return 0; // 请修改这里的return语句
return a>b?a:b; // 请修改这里的return语句
} }


template<typename T, typename F> template<typename T, typename F>
@@ -57,16 +57,21 @@ auto map(const std::vector<T>& vec, F func) -> std::vector<decltype(func(std::de
template <typename T1, typename T2, typename F> template <typename T1, typename T2, typename F>
auto zipWith(const std::vector<T1>& vec1, const std::vector<T2>& vec2, F func) auto zipWith(const std::vector<T1>& vec1, const std::vector<T2>& vec2, F func)
-> std::vector<decltype(func(std::declval<T1>(), std::declval<T2>()))> { -> std::vector<decltype(func(std::declval<T1>(), std::declval<T2>()))> {

using ResultType = decltype(func(std::declval<T1>(),std::declval<T2>()));
std::vector<ResultType> result;
if (vec1.size() != vec2.size()) { if (vec1.size() != vec2.size()) {
// 我们已经在这里throw一个异常 // 我们已经在这里throw一个异常
throw std::invalid_argument("Vectors must have the same size"); throw std::invalid_argument("Vectors must have the same size");
} }
result.reverse(vec1.size());
for(size_t i=0;i<vec1.size();++i){
result.push_back(func(vec1[i],vec2[i]));
}
// 请在这里补全其他部分 // 请在这里补全其他部分
// 提醒:可以使用push_back函数向vector添加元素 // 提醒:可以使用push_back函数向vector添加元素
// 再给你降一点难度:这里需要仿照map函数神明一个result变量。 // 再给你降一点难度:这里需要仿照map函数神明一个result变量。


return std::vector<decltype(func(std::declval<T1>(), std::declval<T2>()))>(1); // 这里记得改掉,改成result
return result; // 这里记得改掉,改成result
} }


template<typename T, typename F> template<typename T, typename F>


Loading…
Cancel
Save