Week 1 Day 3 :Lambda表达式与函数对象设计

6、AWS Lambda 函数基础全解析 本文全面解析了 AWS Lambda 函数的基础知识,涵盖调用方式、执行环境、环境变量、处理程序函数结构、事件与上下文对象、运行时选择以及开发和打包流程。通过实际示例和最佳实践建议,帮助开发者高效构建和管理无服务器应用程序。 阅读详情

日期:2026年1月28日(周三)

今日理论主题:Lambda表达式与函数对象设计

关联实战项目:智能指针家族实现(shared_ptr引用计数机制)

预计学习时间:理论1小时 + 实战1小时

一、核心要点速览

Lambda表达式是现代C++函数式编程的核心特性,它通过简洁的语法实现了匿名函数的定义与传递。今日学习的核心价值在于:

  1. 语法简化革命:将复杂的函数对象定义简化为一行表达式,极大提升了代码可读性
  2. 捕获机制灵活性:通过值捕获、引用捕获、混合捕获等方式,精确控制外部变量的访问方式
  3. 类型系统集成:每个Lambda都有唯一类型,完美融入C++静态类型体系
  4. 性能优化潜力:编译器可内联优化,避免std::function的类型擦除开销
  5. 现代编程范式支持:为并发编程、事件驱动、算法抽象提供基础设施

Lambda不仅改变了C++的编码风格,更是现代软件设计思想(如响应式编程、数据流处理)在语言层面的体现。

二、知识点精讲

1. Lambda表达式基础语法演变

Lambda表达式的发展经历了从繁琐到精简的演进:

// C++11 完整形式(显式返回类型)
auto lambda1 = [](int x, int y) -> int { return x + y; };

// C++11 简写形式(返回类型自动推导)
auto lambda2 = [](int x, int y) { return x + y; };

// C++14 泛型Lambda(参数类型自动推导)
auto lambda3 = [](auto x, auto y) { return x + y; };

// C++17 constexpr Lambda(编译期求值)
constexpr auto lambda4 = [](int x) { return x * x; };
static_assert(lambda4(5) == 25);

// C++20 模板Lambda(显式模板参数)
auto lambda5 = []<typename T>(T x, T y) { return x + y; };

关键理解:Lambda的本质是编译器生成的匿名类,捕获列表对应类的成员变量,函数体对应类的operator()实现。

2. 捕获列表(Capture List)深度解析

捕获列表决定了Lambda如何访问外部作用域的变量,这是Lambda最复杂也最强大的特性:

值捕获 vs 引用捕获
int x = 10, y = 20;

// 值捕获:创建副本,修改不影响外部变量
auto lambda1 = [x]() mutable { 
    x = 100;  // 修改的是副本,外部x仍为10
    return x;
};

// 引用捕获:直接引用外部变量
auto lambda2 = [&y]() { 
    y = 200;  // 直接修改外部y为200
    return y;
};
隐式捕获的陷阱
int a = 1, b = 2;

// [=] 值捕获所有变量:可能造成不必要的拷贝
auto lambda1 = [=]() { return a + b; };  // 拷贝a和b

// [&] 引用捕获所有变量:可能产生悬空引用
auto lambda2 = [&]() { return a + b; };  // 危险!如果lambda生命周期更长

// 混合捕获:精细控制
auto lambda3 = [=, &b]() { b++; return a + b; };  // a值捕获,b引用捕获

初始化捕获(C++14移动语义支持)
auto ptr = std::make_unique<int>(42);

// C++14 初始化捕获:支持移动语义
auto lambda = [data = std::move(ptr)]() {
    return *data;  // data是unique_ptr的所有权转移
};

设计原则:优先使用显式捕获,避免隐式捕获;优先使用值捕获,除非需要修改外部变量或避免拷贝开销。

3. 函数对象(Functor)与Lambda的等价关系

理解Lambda与函数对象的等价关系是掌握其底层机制的关键:

// 传统函数对象
class Adder {
    int offset;
public:
    Adder(int off) : offset(off) {}
    int operator()(int x) const { return x + offset; }
};

// 等价Lambda
int offset = 5;
auto lambda = [offset](int x) { return x + offset; };

// 编译器为Lambda生成的匿名类(概念上)
class __Anonymous_Lambda {
    int offset;  // 对应捕获的变量
public:
    __Anonymous_Lambda(int off) : offset(off) {}
    int operator()(int x) const { return x + offset; }
};

性能洞察:由于Lambda类型已知,编译器可以进行完全内联优化,而std::function由于类型擦除可能产生虚函数调用开销。

4. Lambda的类型系统与存储策略

每个Lambda表达式都有唯一的、不可命名的类型,这带来了存储和传递的挑战:

// 正确存储方式
auto lambda = [](int x) { return x * x; };  // 类型唯一,只能用auto推导

// std::function包装(类型擦除,有性能开销)
std::function<int(int)> func = lambda;

// 函数指针转换(仅限无捕获的Lambda)
int (*func_ptr)(int) = [](int x) { return x * x; };

存储决策树:

  1. 如果Lambda只在局部使用 → 直接使用auto
  2. 如果需要存储或传递到未知上下文 → 使用std::function
  3. 如果Lambda无捕获且需要C接口兼容 → 转换为函数指针

5. Lambda的高级特性与最佳实践

泛型Lambda(C++14)
// 替代函数模板的简洁写法
auto compare = [](const auto& a, const auto& b) { return a < b; };
std::sort(vec.begin(), vec.end(), compare);

constexpr Lambda(C++17)
// 编译期计算,提升运行时性能
constexpr auto factorial = [](int n) {
    int result = 1;
    for (int i = 2; i <= n; ++i) result *= i;
    return result;
};
static_assert(factorial(5) == 120);

立即调用Lambda表达式(IILE)
// 替代复杂初始化代码块
const auto config = []() {
    Config cfg;
    cfg.loadFromFile("config.json");
    cfg.validate();
    return cfg;
}();  // 注意末尾的()表示立即调用

三、关联知识地图

Lambda表达式不是孤立特性,它与C++生态系统的多个核心组件深度集成:

1. Lambda与STL算法

std::vector<int> numbers{1, 2, 3, 4, 5};

// 函数式变换
std::transform(numbers.begin(), numbers.end(), numbers.begin(),
               [](int x) { return x * 2; });

// 条件筛选
auto it = std::remove_if(numbers.begin(), numbers.end(),
                        [](int x) { return x % 2 == 0; });

2. Lambda与并发编程

// std::async异步任务
auto future = std::async(std::launch::async, []() {
    std::this_thread::sleep_for(1s);
    return computeResult();
});

// std::thread线程创建
std::thread worker([]() {
    processData();
});

3. Lambda与RAII模式结合

class Resource {
    std::function<void()> cleanup;
public:
    Resource(std::function<void()> clean) : cleanup(clean) {}
    ~Resource() { cleanup(); }
};

// 使用Lambda定义清理逻辑
Resource res([&]() { 
    releaseHandles(); 
    logCleanup(); 
});

4. Lambda在智能指针中的应用

// 自定义删除器(替代函数对象)
std::unique_ptr<FILE, decltype([](FILE* f) { fclose(f); })>
    file(fopen("data.txt", "r"), [](FILE* f) { fclose(f); });

四、实战练习指引

今日实战:shared_ptr引用计数实现

虽然今日理论主题是Lambda表达式,但今日的实战练习是实现shared_ptr的引用计数机制。理解两者关联有助于深化对现代C++设计模式的理解。

Lambda在智能指针中的潜在应用
template<typename T>
class shared_ptr {
    T* ptr;
    int* ref_count;
    std::function<void()> custom_deleter;  // 使用std::function支持Lambda删除器
    
public:
    // 支持Lambda自定义删除器
    template<typename Deleter>
    shared_ptr(T* p, Deleter del) 
        : ptr(p), ref_count(new int(1)), 
          custom_deleter([del, this]() { del(ptr); }) {}
    
    ~shared_ptr() {
        if (--(*ref_count) == 0) {
            if (custom_deleter) {
                custom_deleter();  // 调用Lambda删除器
            } else {
                delete ptr;
            }
            delete ref_count;
        }
    }
};

实现建议与调试要点
  1. 引用计数同步:确保拷贝构造、赋值操作都正确更新引用计数
  2. 移动语义优化:实现noexcept移动操作,避免不必要的引用计数操作
  3. 自定义删除器支持:使用std::function包装Lambda,提供灵活的资源管理
  4. 线程安全考虑:虽然基础版本不考虑,但要了解原子操作的必要性

测试用例设计思路
void test_shared_ptr_with_lambda() {
    // 使用Lambda作为自定义删除器
    shared_ptr<FILE> file(
        fopen("test.txt", "w"),
        [](FILE* f) { 
            if (f) {
                fclose(f); 
                std::cout << "文件已关闭" << std::endl;
            }
        }
    );
    
    // 测试引用计数
    auto ptr1 = std::make_shared<int>(42);
    auto ptr2 = ptr1;  // 引用计数应为2
    assert(ptr1.use_count() == 2);
}

五、自我检测题

题目1:捕获语义分析

int x = 10;
std::function<int()> func;

{
    int y = 20;
    func = [x, &y]() { return x + y; };
}  // y离开作用域

std::cout << func() << std::endl;  // 输出什么?为什么?

考察点:引用捕获的生命周期陷阱

题目2:mutable关键字作用

int val = 5;
auto lambda1 = [val]() { /* val = 10; */  // 这行代码能否编译?为什么? */
auto lambda2 = [val]() mutable { val = 10; };  // 能否编译?val的值是多少?

考察点:mutable对值捕获变量的修改权限

题目3:类型推导与存储

auto lambda = [](auto x) { return x * 2; };

// 以下哪种存储方式正确?为什么?
// A. std::function<int(int)> f = lambda;
// B. auto f = lambda;
// C. int (*f)(int) = lambda;

考察点:泛型Lambda的类型特性与存储策略

题目4:性能优化选择

你正在开发高性能计算库,需要在以下场景中选择最佳实现:

  1. 频繁调用的简单谓词(如比较函数)
  2. 需要存储到容器的回调函数
  3. 接口兼容C的插件系统

请为每个场景推荐Lambda的使用模式,并说明理由。

考察点:Lambda在实际工程中的性能权衡

题目5:现代C++特性组合

使用C++17特性,编写一个constexpr Lambda,计算斐波那契数列第N项,并在编译期验证结果。

考察点:Lambda与constexpr、模板元编程的结合

六、扩展学习建议

  1. 深入阅读:《Effective Modern C++》条款31-34,理解Lambda的最佳实践与陷阱
  2. 代码实践:在现有shared_ptr实现中,添加对Lambda自定义删除器的完整支持
  3. 性能分析:使用Benchmark工具比较Lambda、std::function、函数指针的性能差异
  4. 设计模式应用:探索Lambda在观察者模式、策略模式中的简化作用
  5. 并发编程结合:研究Lambda在std::async、std::thread、线程池中的应用模式

七、今日学习目标检查清单

  • 理解Lambda表达式与函数对象的等价关系
  • 掌握值捕获、引用捕获、初始化捕获的使用场景
  • 能够解释mutable关键字对值捕获变量的影响
  • 理解std::function的类型擦除机制与性能开销
  • 能够在shared_ptr实现中集成Lambda自定义删除器
  • 完成至少3道自我检测题并验证答案

学习提示:Lambda表达式是现代C++函数式编程的基石,其简洁语法背后是复杂的类型系统和编译器优化。建议在理解语法的基础上,深入思考其设计哲学:如何平衡表达力与性能、灵活性与安全性。今日的shared_ptr实战将帮助你体会Lambda在实际工程中的应用价值。

Fiddler Everywhere保姆级教程:10分钟搞定手机HTTPS抓包(附证书配置避坑指南) 本文提供Fiddler Everywhere移动端HTTPS抓包的保姆级教程,涵盖环境配置、代理设置、证书安装及常见问题排查。重点解析如何正确安装并信任Fiddler根证书以解密HTTPS流量,帮助开发者快速搭建抓包环境,高效分析应用网络行为,提升调试效率。 阅读详情

相关推荐

ESXI 8.0.3 ubuntu 24.04 直通显卡P40

手把手,一步步教你直通GPU,ESXI 8.0.3 ubuntu 24.04 直通显卡P40

qq_36433118的博客 4682

week3 day4 函数收尾

week3 day4函数收尾一. 三元表达式二. 生成式2.1 列表生成式2.2 字典生成式2.3 生成器表达式三. 函数的递归调用四. 匿名函数五. 面向过程编程 一. 三元表达式 对于我们平时所写的行数较少的代码,可以把他改写成三元表达式的形式。 x=11 y=12 if x>y: print(x) eles: print(y) 可以用一行解决。 res=x if x>y else y print(res) 即条件一元,条件成立的返回值一元,条件不成立的返回值一元。 二. 生成式 2

weixin_53587094的博客 616

Gromacs实战:从蛋白质-小分子对接到分子动力学模拟全流程解析

本文详细解析了使用Gromacs进行蛋白质-小分子对接和分子动力学模拟的全流程,包括文件准备、拓扑生成、复合物构建、溶剂化处理、能量最小化及平衡模拟等关键步骤。通过实战案例,帮助研究者验证药物分子与靶标蛋白的结合稳定性,提升分子动力学模拟的效率和准确性。

weixin_29216353的博客 380

ja-week05-day19-接口中Lambda的用法

一.Lambda表达式(->),函数式编程 1.仅应用于接口中,且接口中只有一个抽象方法存在(comparator接口中有很多方法,但是抽象方法只有几个,而自己定义的抽象方法只有一个,其他的抽象方法都是继承Object类的,不算自己的);可以简化代码量; ->是Java 8新增的Lambda表达式中,变量和临时代码块的分隔符,即: (变量) -> {代码块} 如果代码块只有一个表达式,大括号可以省略。如果变量类型可以自动推断出来,可以不写变量类型。 2.接口中方法没有参数的应用; publ

qq_45052062的博客 231

Qt5+OSG实战:如何用osgQOpenGLWidget在窗口中加载3D模型(附完整代码)

本文详细解析了如何在Qt5中使用osgQOpenGLWidget加载和渲染3D模型,涵盖环境配置、核心架构、性能优化及高级技巧。通过实战案例和完整代码,帮助开发者实现工业级3D模型渲染,提升Qt与OSG的整合效率。

weixin_42741930的博客 263

Codesys.运动控制修改凸轮点

通过改凸轮曲线的主从轴缩放比例或者偏置。 新建多个凸轮曲线,对CAM曲线进行切换。 程序中动态修改,仅修改中间的关键点(凸轮末点修改or凸轮曲线运行中修改)。 程序中动态修改,修改首未关键点及关键点个数,需要重新触发MC_TableSelect。 使用程序新建凸轮表代码,实现电子凸轮基本运动。 我们讲的凸轮表切换、关键点修改、程序新建电子凸轮,这些方法没有本质区别,总之都是“趁曲线不注意,把凸轮表改了。

傻响雨 6828

AWS Lambda中的Cron表达式解析器

这是AWS Lambda上的简单API示例,其中包含有关如何创建简单网页并将其连接到API的完整说明,所有这些都在AWS控制台中。使用的服务:AWS Lambda、AWS API Gateway、AWS Amplify。Lambda函数的代码是用Node.js编写的。它是一个cron表达式解析器,它为您提供下一次给定的cron表达式触发事件的时间。

寒冰屋的专栏 1092

保姆级教程:用高云GW2A开发板搭建RISC-V软核处理器(含DDR3内存优化配置)

本文提供了一份详细的保姆级教程,指导开发者使用高云GW2A-LV18PG256C8 FPGA开发板搭建RISC-V软核处理器系统。教程涵盖了从开发环境搭建、PicoRV32软核集成,到关键的DDR3内存控制器配置与优化,并深入讲解了时序约束与系统调试方法,帮助初学者和爱好者实现从逻辑设计到软硬件协同的深度实践。

2a4s6d8f0g的博客 566

python day1 函数

python 函数

qq_45906101的博客 748

【华为OD机试真题】4、字符统计及重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数, 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前

KJ.JK 3289

20、自定义用户窗体:从创建到使用

本文详细介绍了在Excel VBA中创建和使用自定义用户窗体的完整过程,涵盖从窗体设计、控件添加与属性设置,到事件处理程序编写及宏调用的各个环节。通过实际示例讲解了如何实现文本大小写转换和员工信息录入等功能,并深入解析了常用控件的属性与事件机制。同时提供了控件命名规范、快捷键使用、布局技巧等实用建议,帮助读者构建高效、交互性强的VBA用户界面。

h0i1j2k3l的博客 131

【大数据开发】Java语言基础——Date、DateFormat、SimpleDateFormat、Calender、Math类库、enum枚举、lambda表达式day12

今天学习的东西比较多,其中在学习Java中的类库时需要不停翻阅API,今天主要学习了Java中一些常用的类库和lambda表达式,只有通过查阅API才能够真正知道各种类库之间的继承关系、常量、构造方法和其他的方法,并且这不能只通过学习书上写的东西,因为书上写的东西往往有很多地方不好表达出来,这一块只能通过自己动手写写才能记住和学会。后面继续学习了lambda表达式,这是jak1.5版本之后才有的,lambda表达式的出现更加体验了Java这门语言的优雅!好了,下面就是今天学习的笔记了。 一、Date、D.

白色风车 346

YOLO模型从10MB瘦到2MB!剪枝+INT8量化双方案(精度损失<1%,附部署代码)

摘要:本文介绍了一种针对边缘设备的YOLO模型轻量化方案,通过"结构化剪枝+INT8量化"组合技术,将YOLOv8n模型从6.4MB压缩至2MB,体积减少68.75%,推理速度提升80%,同时保持精度损失小于1%。文章详细讲解了剪枝工具选择、通道剪枝实现、量化校准等关键步骤,并提供了完整的代码示例。特别强调了剪枝保留率、校准集使用、微调必要性等实践要点,帮助开发者在树莓派等资源受限设备上实现高效目标检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 756

week03学习总结

week03学习总结

qq_61966149的博客 1254

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Week 1 Day 1 :auto、decltype与类型推导机制

auto是C++11引入的类型说明符,通过初始化表达式自动推断变量类型,其推导规则与模板类型推导基本一致(三种情况)。

phaethonWB的博客 1181

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Week 2 Day 5:单例模式与工厂模式深度解析

概念定义设计模式是针对软件设计中常见问题的可复用解决方案模板,是经验丰富的开发者总结的最佳实践。分类体系创建型模式:关注对象创建机制(单例、工厂、建造者等)结构型模式:关注类与对象的组合方式(适配器、装饰器、代理等)行为型模式:关注对象间的通信与职责分配(观察者、策略、命令等)解决的问题提高代码复用性增强系统可维护性降低模块间耦合度提升设计灵活性。

phaethonWB的博客 938

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

week3day2高阶函数

高阶函数(实参高阶函数,返回追高阶函数)+装饰器 高阶函数 1.实参高阶函数 —— 如果一个函数的参数是函数,那么这个函数就是实参高阶函数(怎么使用系统提供的实参高阶函数) 2.返回值高阶函数 —— 如果一个函数的返回值是函数,那么这个函数就是返回值高阶函数(会写装饰器) 常用实参高阶函数:max、min、sorted、map、reduce ''' max(序列, key=函数) 函数的要求:1)有且只有一个参数,这个参数指向的是数前面序列中的每个元素 2)需要一个返回值,返回值决定求最大值的时候比

qq_39842253的博客 143

Introduction to Data Science in Python Week 1

Introduction to Data Science in Python week 1: Python Fundamentals Python Dates and Times import datetime as dt import time as tm tm.time() #time returns the current time in seconds since the Epoch. (...

momo的博客 1915

week02_Exercise_02

week02_Exercise_02 简答题: 第一题:内部类 1、总结一下局部内部类的成员特点。 答:和内部成员一样,没有静态声明。 没有静态成员变量,静态成员方法,以及静态代码块、但是可以定义字面值常量赋值的全局常量 第二题:局部内部类 2、总结一下局部内部类的访问特点。(要分外围类成员方法中和静态方法中的局部内部类两种情况) 答:外围类成员方法中局部内部类对象,由于会持有外围类的对象的引用作为成员变量,所以可以直接访问外围类 而外围类静态成员方法中局部内部类对象,不持有任何外围对象,所以需要先创建外围

m0_70087085的博客 201

常用类,枚举和注解,集合和泛型以及lambda表达式学习总结

常用类 1.string类 public int length() public char charAt(int index):返回在指定index位置的字符。index从0开始 public boolean equals(Object anObject):比较两个字符串是否相等。相等返回true。否则返回false public int compareTo(String anotherString) public int indexOf(String s):返回s字符串在当前字符串中首次出现的位置。若没有

weixin_51710009的博客 220

kotlin函数

kotlin函数的基本用法学习

习惯就好zz的专栏 1478

31DaysOfKotlin - Day3—解构声明

内容总结 Kotlin的解析声明这个语法糖主要是方便我们一次性获取某个对象变量的多个成员字段值。 // 普通获取对象成员的方式 val name = person.name val age = person.age //析构声明的方式是 val (name, age) = person //对应析构声明翻译后的代码大概如下 val name = person.component1() val ag...

技术的学习与积累是个技术活 277

python定义函数的命令_Python入门 | 定义函数

自用复习备忘总结。一些定义函数:一段用来封装任务的代码封装:用一个简单的命令执行一系列步骤的方式3. 对象python使用对象来存储数据。构造任何类型的值都是一个对象。所有对象都具有三个特性:身份、类型、值【身份】每个对象都有一个唯一的身份来标识自己任何对象的身份可以用 id() 得到【类型】对象的类型 决定了 该对象可以保存什么类型的值、可以遵循什么样的操作、什么样的规则type() 查看对象类...

weixin_39831705的博客 392

Java语言新特性:随着Java版本的更新,语言层面上有很多新的特性和改进,比如lambda表达式、流API、模块系统等等

Java语言新特性:随着Java版本的更新,语言层面上有很多新的特性和改进,比如lambda表达式、流API、模块系统等等、Lambda表达式(Java 8)、Stream API(Java 8)、模块系统(Java 9)、局部变量的类型推断(Java 10)、切换表达式(Java 12)、记录(Record)(Java 14)、文本块(Text Blocks)(Java 14)、实例模式匹配(Pattern Matching for instanceof)(Java 16)

哎 你看的博客 472

Python学习笔记【week02day4】函数参数,万能函数,匿名函数,zip函数,装饰器

函数参数,万能函数,匿名函数,zip函数,装饰器函数参数1. 位置参数【又称必选参数】2. 关键字参数:3. 默认参数4. 不定长参数万能(参数)函数匿名函数zip函数装饰器复杂点的装饰器 函数参数 1. 位置参数【又称必选参数】 传递参数的顺序与定义的顺序有关,必须按照定义的顺序来进行传递。 传递参数的个数与参数的个数必须保持一致。 def func1(name,age) 2. 关键字参数: ...

HFZeng的博客 251

java8与java17的比较

具体来说,Java17引入了ZGC(Z Garbage Collector)垃圾回收器,该回收器使用了全新的垃圾回收算法和技术,能够在秒级别内完成大堆内存的垃圾回收,从而实现了更高的性能和更短的停顿时间。Java中的垃圾回收机制是一种自动内存管理的机制,其主要功能是通过标记和清除未使用的内存块来释放已经不再使用的对象占用的内存空间。在Java中,垃圾回收器会定期扫描堆内存中的对象,标记所有可以被访问的对象,并将未被标记的对象视为垃圾对象进行清理。

Flying_Fish_roe的博客 1057
上一篇: Week 1 Day2 :实现简化版unique_ptr(独占所有权)
下一篇: Week 1 Day 4 代码挑战:实现简化版shared_ptr(引用计数)
phaethon.wu
博客等级 码龄5年 0粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值