C++设计模式

C++ 设计模式 在C++中,设计模式(Design Patterns)是用于解决在软件设计中经常遇到的一些通用问题的最佳实践。这些设计模式是在多年的软件开发过程中积累下来的经验和智慧的结晶。定义一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。将一个类的接口转换成客户端所期望的另一种接口,从而使得原本由于接口不兼容而无法一起工作的类能够一起工作。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 阅读详情

UML统一建模语言

  1. 基于面向对象的可视化建模语言。本质其实是一些图形
  2. UML中的关系:
    泛化关系:比如类的继承
    关联关系:包含和被包含的关系,比如类作为另一个类的成员
    依赖关系:比如类传参进去
    实现关系:比如微信支付和支付

设计模式

基本概念

  1. 设计模式是在特定环境下人们解决某类重复出现的问题的一套成功或有限的方案
  2. 在代码里面就是充分提高代码 复用性, 指导代码的思路方法,相当于内功,与具体语言无关
  3. 设计模式的基础就是 多态

面向对象设计原则

  1. 如何提高系统的可维护性和可复用性是面向对象设计的核心问题
  2. 大原则:高内聚、低耦合
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

开闭原则

  1. 对扩张开放,对修改关闭,增加功能通过增加代码实现,而不是通过修改原来的代码,少改代码,减少出错可能
  2. 例子就是比如写一个计算器类,通过抽象基类,再用子类继承,重写实现,这样通过父类指针就可以指向不同的子类实现,达到一个接口,多种形态的效果,以后增加功能只需要再增加对应的代码就好,不用修改原来的代码。

迪米特原则

  1. 最少知识原则,写了一个类,应该尽可能少的暴露内部给其他人,只提供它们需要的接口就行
  2. 例子就是我想写一个买房子的功能,有类里面有各种各样房子的信息,房子有各种特征,实现这个功能时候,不是说我来一个个去判断他这些房子是否满足我要求,而是写一个接口,只需要传入我的要求,他就给我返回最合适的选择

合成复用原则

  1. 就是一个类想要另外一个类的方法,可以通过继承实现, 也可以通过组合实现
  2. 少用继承,优先使用组合。

依赖倒转原则

传统的:
在这里插入图片描述
依赖倒转
在这里插入图片描述

简单工厂模式

在这里插入图片描述

  1. 就是创建一个专门生产对象的类,创建类的时候调用它的方法。在工厂中判断,需要生产什么类就生产啥,这样用户不用管怎么创建。
  2. 这个模式应用有限,有缺陷,不符合开闭原则,要跟新功能的时候还需要去改代码,一个工厂需要做到功能太多。
  3. 只适合在那种,比如创建一个对象步骤比较麻烦,但是又需要经常创建,就把这个事情分给工厂做,不让用户管对象是咋创建的。
    在这里插入图片描述

工厂方法模式

在这里插入图片描述

  1. 这个模式是简单工厂的改进,可以符合开闭原则了,但是类变多了,维护成本增加了,一个产品就得对应一个类。
  2. 就是用一个工厂创建一个类
    在这里插入图片描述

抽象工厂模式

在这里插入图片描述

  1. 不同国家的水果,构成产品等级, 一个国家的水果,构成产品族
  2. 抽象工厂模式,对于增加产品族,是方便的,页满足开闭原则,但是如果需要增加产品等级,那就不符合开闭原则了

单例模式

  1. 加入限制,保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
  2. 可以在特定用途下,可以避免资源重复占用
  3. 比如windows的任务管理器,你开了一个窗口,你再去打开新窗口,他还是只有一个窗口,系统中就只创建和 维护一个窗口
    在这里插入图片描述

懒汉模式

  1. 不是main开始之前就创建,而是的等用到了,才去创建
  2. 把构造函数私有化,这样就不能在外部是实列化对象,这时候,使用静态指针去指向这个类的对象,在类外一开始初始化为NULL,然后设计一个静态成员函数,在这个静态成员函数中实例化一个对象,并返回对象指针。
  3. 懒汉模式,如果多线程中每个线程都会去创建,就有可能创建出多个对象,是线程不安全的的。
    在这里插入图片描述
    程序结束时自动析构的改进:
//代码实例(线程安全) 
template<typename T> 
class Singleton { 
public: 
	static T& getInstance() {
		if (!value_)  value_ = new T(); 
		return *value_; 
    } 
private:      
	class CGarbo{
		public:
			~CGarbo(){
				if(Singleton::value_) delete Singleton::value_;
			} 
	};         

	Singleton();
	~Singleton();
	static T* value_; 
	static CGarbo Garbo;
}; 
template<typename T> T* Singleton<T>::value_ = NULL;

线程安全的改进,通过判断指针以及加锁的方式,两次判断指针是否为空。

class Singleton {
public:
    static Singleton* instance();
    void show();
private:
    static Singleton* singleton;
    static int num;
};

Singleton* Singleton::singleton = nullptr;
int Singleton::num = 0;
mutex Singleton::m;
 
Singleton* Singleton::instance(){
    if(singleton == nullptr){
        m.lock();
        if(singleton == nullptr) {
            singleton = new Singleton();
            num++;
        }
        m.unlock();
    }
    return singleton;
}
 
void Singleton::show(){
    cout << "num : " << num << endl;
}

饿汉模式

  1. 他会在编译阶段就创建出来,在main之前
  2. 如果这个类占用资源比较多的话,程序一开始他就会开始占用资源,即使还没有用到
  3. 饿汉模式一般在main执行之前就创建了,不在多个线程中创建,所以是线程安全的。在这里插入图片描述

代理模式

  1. 为其他对象提供一种代理,用来控制对这个对象的访问
  2. 比如 系统类,我不是直接可以调用它的成员,而是我再通过一个 代理类,通过这个类来调用系统类函数,这样就可以增加比如验证用户、密码这样的功能,这就可以对系统类做一些限制。

外观模式

  1. 就是将复杂的子类系统抽象到同一个接口进行管理,外界只需通过此接口进行交互,而不必直接与复杂的子系统交互
  2. 比如有个 系统基类,有四个子系统类,我要启动这四个子系统对象的时候,我得挨个去调用,这个时候,我写一个外观类,我直接用这一个外观类去启动这些子系统,这样我们呈现给用户的就是很简洁的接口。
  3. 比如 我们有很多比如电视、音响、灯这些类,而我们呢要实现一个ktv功能,就可以把关灯、开电视、开音响这些东西,都封装到一个统一的饿简洁的接口上,调用这个接口就可以了。
    在这里插入图片描述

适配器模式

  1. 类似于电源适配器那样理解,电源是适配器把220v交流带你转成5v直流电给手机充电
  2. 所以适配器模式,就是把一个类的接口转换成用户希望的另外一种接口,使得原本不兼容而不能一起工作的类能够一起工作。
  3. 比如我后面写的类要配合库里面的类进行使用,可能接口就是不好对上,所以需要写一个适配器类去转换一下。

模板方法模式

  1. 比如某个事情或者算法步骤是一样的,只是在每一步上实现细节有不一样,这个时候,就可以创建一个作这件事的的模板,这个模板就框定了做事方法步骤,只是在每步具体的时候用具体的实现
  2. 比如泡茶,泡咖啡,它们步骤方法基本一样,只是每步实现细节不一样。
    在这里插入图片描述
    在这里插入图片描述

策略模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建的角色类,他可动态加载不同的方法,加载什么方法就使用什么方法
在这里插入图片描述

命令模式(动作模式/事务模式)

  1. 抽象出服务端和客户端,客户端向服务端发送请求,服务端处理请求,客户端发不同的请求,服务端响应不同的请求
  2. 在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

观察者模式

在这里插入图片描述

  1. 应用 于一个对象的变化后,需要引起其他对象的变化的情景
  2. 举例就是,比如红绿灯,红绿灯的状态变化后,需要引起等待的车的状态变化,当车来到红绿灯前面的时候,车需要开始观测这个红绿灯,当车离开这个红绿灯之后,就不用看这个红绿灯了。
  3. 之间建立一套触发机制,能降低目标与观察者之间的耦合关系,缺点是两者之间依然有依赖关系,可能出现循环引用,当观察者过多得时候,更新状态花费时间久。
  4. 一个目标类,他里面存储了他的观察者们,他的状态发生变化后,会更新观察者们得状态。

装饰器模式

在这里插入图片描述

  1. 就是不改变原来类的情况下,动态得给这个类增加一些新功能,之前是通过继承实现
  2. 举例比如,有个英雄类,还有很多个装备类,英雄一开始没有装备的,他没什么技能,他可以通过动态的增加一些装备,逐渐有一些技能,逐渐拥有那些装备类的功能。
  3. 还可以通过不同装饰器组合实现更多功能
  4. 缺点是会增加很多子类,程序变复杂
#include <string>
#include <iostream>
//基础组件接口定义了可以被装饰器修改的操作
class Component {
 public:
  virtual ~Component() {}
  virtual std::string Operation() const = 0;
};
//具体组件提供了操作的默认实现。这些类在程序中可能会有几个变体
class ConcreteComponent : public Component {
 public:
  std::string Operation() const override {
    return "ConcreteComponent";
  }
};
//装饰器基类和其他组件遵循相同的接口。这个类的主要目的是为所有的具体装饰器定义封装接口。
//封装的默认实现代码中可能会包含一个保存被封装组件的成员变量,并且负责对齐进行初始化
class Decorator : public Component {
 protected:
  Component* component_;
 public:
  Decorator(Component* component) : component_(component) {
  }
  //装饰器会将所有的工作分派给被封装的组件
  std::string Operation() const override {
    return this->component_->Operation();
  }
};
//具体装饰器必须在被封装对象上调用方法,不过也可以自行在结果中添加一些内容。
class ConcreteDecoratorA : public Decorator {
 //装饰器可以调用父类的是实现,来替代直接调用组件方法。
 public:
  ConcreteDecoratorA(Component* component) : Decorator(component) {
  }
  std::string Operation() const override {
    return "ConcreteDecoratorA(" + Decorator::Operation() + ")";
  }
};
//装饰器可以在调用封装的组件对象的方法前后执行自己的方法
class ConcreteDecoratorB : public Decorator {
 public:
  ConcreteDecoratorB(Component* component) : Decorator(component) {
  }
  std::string Operation() const override {
    return "ConcreteDecoratorB(" + Decorator::Operation() + ")";
  }
};
//客户端代码可以使用组件接口来操作所有的具体对象。这种方式可以使客户端和具体的实现类脱耦
void ClientCode(Component* component) {
  // ...
  std::cout << "RESULT: " << component->Operation();
  // ...
}
int main() {
  Component* simple = new ConcreteComponent;
  std::cout << "Client: I've got a simple component:\n";
  ClientCode(simple);
  std::cout << "\n\n";
  
  Component* decorator1 = new ConcreteDecoratorA(simple);
  Component* decorator2 = new ConcreteDecoratorB(decorator1);
  std::cout << "Client: Now I've got a decorated component:\n";
  ClientCode(decorator2);
  std::cout << "\n";
 
  delete simple;
  delete decorator1;
  delete decorator2;
 
  return 0;
}
源于Design Pattern Explanation with C++ Implementation的 设计模式 C++ 1、单例模式(Singleton Pattern ) 2、抽象工厂模式(Abstract Factory Pattern ) 3、工厂方法模式(Factory Method Pattern ) 4、简单工厂模式(Simple Factory Pattern ) 5、建造者模式(Builder Pattern ) 6、原型模式(Prototype Pattern ) 7、结构模式(Str 阅读详情

相关推荐

《C++ 设计模式》

设计模式代表了最佳的实践,在面向对象的编程中被很多老鸟们反复使用。使用设计模式有很多好处:可重用代码、保证代码可靠性、使代码更易被他人理解 ......

青春不老,奋斗不止! 9万+

C++设计模式(全23种)

设计模式概述 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。等这种思想融入到了思想中后,你就会不自觉地使用这种思想去进行你的设计和开发。 文章目录设计模式概述一、创建型模式Factory 模式(工厂模式)AbstactFactory 模式(抽象工厂模式)Singleton 模式( 单例模式)Builder 模式(建造者模式)Prototype 模式(原型模式)二、结构型模式Bridge 模式(桥接模式)总结

weixin_45712636的博客 9万+

Plot3d 网格数据格式

PLOT3D是一个计算机图形程序,旨在可视化计算流体力学的网格和解决方案。PLOT3D文件可以是ASCII, 也可是Fortran unformatted 或 C binary形式。PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。

weixin_62592231的博客 3720

C++ 常用设计模式(学习笔记)

设计模式 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。使用简单工厂模式,我们只需要知道具体的产品型号就可...

duchengjun的博客 1910

关于SVPWM七段式五段式调制后的相电压和线电压波形——大疆DJI技术笔试

1.SVPWM七段式/五段式调制的相电压和线电压波形 脉宽调制(PWM)在并网变流技术中得到了广泛的应用。与正弦脉宽调制(SPWM)的控制方法相比,SVPWM方法具有直流侧电压利用率高,电压谐波小,易于数字化实现等显著的优点,从而使SVPWM在实际的应用中越来越普遍。TMS320F28335是32位浮点的DSP控制器,具有150MHz的高速处理能力,18路PWM输出,与前几代数字信号控制器相比,性能平均提高了50%。其中具体的SVPWM理论实现的原理,请参考我的博客永磁同步电机的矢量控制策略(七)一一一SV

昔时扬尘处 2万+

计算机组成原理(二)—— 数据的表示与运算

本章目录引言一、数制与编码1.1 进位计数制1.1.1 进制及转换1.1.2 真值、机器数1.2 BCD码1.3 ASCII 码1.4 校验码1.4.1 奇偶校验码1.4.2 海明码1.4.3 CRC循环冗余码二、定点数的表示和运算2.1 定点数的表示2.1.1 无符号2.1.2 有符号(原码、反码、补码、移码)2.2 定点数的运算2.2.1 移位运算2.2.2 加减运算(溢出判断)2.2.3 乘法运算2.2.4 除法运算2.3 强制类型转换2.4 数据的存储和排列三、浮点数的表示和运算3.1 浮点数的表示

S mile0804的博客 7473

C++设计模式总结

一、单例模式 一个类不管常见多少次对象,永远只能得到该类型一个对象的实例 // p1、p2、p3指向同一对象 A* p1 = new A(); A* p2 = new A(); A* p3 = new A(); 饿汉式单例模式: 还没有获取实例对象,实例对象就已经产生了 优点:线程安全。对象存放在数据段,main函数还没有开始执行,对象就已经初始化好了,一定是线程安全的。 缺点: 获取在软件启动的时候,并没有使用到这个对象,然而这个对象已经产生,这就比较浪费资源。 #include<iostream

长期更新自学笔记 5246

SAP CKMLCP 月结7大常见报错:从“未找到成本核算运行”到“物料占用”的完整解决方案

本文深入解析SAP CKMLCP月结过程中的7大常见报错,从权限问题到数据一致性错误,提供系统化的解决方案。重点解决'未找到成本核算运行'和'物料占用'等典型问题,帮助财务人员高效完成成本核算月结,确保数据准确性。

weixin_30299709的博客 415

23种设计模式的cpp举例

23种设计模式的cpp举例

SnailElderBro的博客 1722

芯片封装、功率密度提升及热管理系统优化三个维度分析高功率芯片散热技术挑战

本文探讨高功率芯片散热技术挑战与创新。随着新能源汽车MOSFET用量增至400颗/车,文章聚焦封装技术创新(双面散热、集成模块)、功率密度提升(SGT-MOSFET优化)和热管理系统协同优化三大方向。通过热仿真案例(如CPO散热优化)展示温升改善方案,强调需协同器件级设计、系统级仿真与先进封装技术(混合键合/玻璃基板)来解决高密度互连与散热矛盾,为功率密度跃升提供技术支撑。

莱歌数字的博客 1473

基于TKVA与深度学习的量子点微型光谱仪光谱重建改进算法研究

本文提出了一种融合深度学习的改进TKVA算法(TKVA-DL),用于提升量子点微型光谱仪的光谱重建精度。该方法创新性地结合深度先验网络与注意力机制,通过自适应学习光谱隐式先验替代传统固定正则化项,并动态加权探测器响应通道。实验表明,所提方法在仿真和实测数据上均显著优于传统TKVA及主流深度学习算法,RMSE降低35%,PSNR提升4.2 dB,同时保持物理可解释性。完整MATLAB实现验证了方法的有效性与可复现性,为微型光谱仪的高精度重建提供了新思路。 关键词:量子点微型光谱仪;光谱重建;Tikhonov正

AI的内部世界的博客 83

【CPP】一文带你掌握CPP设计模式

设计模式是软件开发中用于解决常见问题的经典解决方案。它们是由经验丰富的开发者总结出来的最佳实践,能够提高代码的可维护性、可扩展性和可复用性。设计模式是软件开发中的经典解决方案,能够提高代码的可维护性、可扩展性和可复用性。通过掌握常见的设计模式,开发者可以更好地组织代码结构,解决复杂问题。理解模式的核心思想:每个设计模式都有其独特的应用场景和解决问题的方式。灵活运用:在实际开发中,根据具体需求选择合适的设计模式。避免过度设计:设计模式是工具,而不是目标,避免为了使用模式而增加不必要的复杂性。

Ape's IT Blog 948

具身智能中的(VLA)算法与实践——第一讲 基础与概览

本文介绍了视觉-语言-动作(VLA)模型的基础概念及其在AI领域的重要性。VLA模型通过融合多模态数据实现具身智能,使AI系统能感知环境并执行物理动作。文章探讨了大型语言模型(LLMs)和视觉语言模型(VLMs)如何赋能具身智能,包括指令解析、场景理解和动作规划。同时提供了Python、PyTorch/TensorFlow开发环境的详细搭建指南,包含GPU配置建议和测试代码。VLA模型在机器人操作、导航、人机协作等领域具有广泛应用前景,是实现通用人工智能的关键技术。

u012133341的博客 1598

cpp_redis源码架构解析:深入理解现代C++ Redis客户端设计模式

cpp_redis是一个基于C++11的异步多平台轻量级Redis客户端库,它支持同步操作、流水线、哨兵和高可用性。这个现代化的C++ Redis客户端库设计精巧,采用了多种现代C++设计模式,为开发者提供了高效、线程安全的Redis访问能力。本文将深入解析cpp_redis的源码架构,帮助您理解其核心设计思想和实现原理。 ## 架构概览:分层设计与模块化 cpp_redis采用了清晰的分层架

gitblog_01072的博客 1007

AndroidKiller之APK 编译失败,无法继续下一步签名【BUG解决】【App反向解析】

文章目录项目场景:问题描述原因分析:解决方案:BUG解决 项目场景: AndroidKiller: 在反向解析APP包时报错:APK 编译失败,无法继续下一步签名。 网上很多方法都是无效的哈,我追究原因发现,这个bug的出现大部分情况都是因为Apktool的问题。 此方法:百分之百解决此bug! 错误如下: 问题描述 APK 编译失败,无法继续下一步签名! 原因分析: Apktool版本不适配的问题,现在的技术更新换代太快,我们安装AndroidKiller的时候,有时候不是官方渠道的话,他的版本是非常

一键难忘的博客 2万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

设计模式【cpp实现版本】

单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。常见的实现方式包括饿汉式和懒汉式。饿汉式在程序启动时即创建实例,线程安全但可能浪费资源;懒汉式在首次使用时创建实例,需考虑线程安全问题,可通过加锁或静态局部变量实现。工厂模式则用于封装对象的创建过程,分为简单工厂、工厂方法和抽象工厂。简单工厂通过一个工厂类创建多种产品,但扩展性差;工厂方法为每种产品提供一个工厂类,扩展性好;抽象工厂则用于创建一系列相关产品,适合产品簇的场景。这些设计模式有助于提高代码的可维护性和扩展性。

qq_55317476的博客 1154

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MediaMTX 移动端 HLS 卡顿慢?调 3 个 LL-HLS 参数把首帧压到 1 秒内

你用手机在地铁、弱 WiFi 里打开直播间,画面卡在缓冲圈转了十几秒才出来——这是用 MediaMTX 分发直播时最常见的 HLS 加载慢问题。MediaMTX 是一个开箱即用的实时媒体服务器,能把 RTSP / RTMP / SRT / WebRTC 等直播流转成 **LL-HLS(低延迟 HLS)**,供手机浏览器和 App 直接播放。慢,往往不是带宽不够,而是几个配置项没调到位。下面按「排查

gitblog_01117的博客 408

深度学习工具包 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'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('DeepLearnToolbox'));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('state',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'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',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 = 'sigm';%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, 'Too big error');```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('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';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)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';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, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% 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'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 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, 'Too big error');```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('state',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, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',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, 'Too big error');%% ex3 neural net with dropoutrand('state',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, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % 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, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % 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, 'Too big error');%% 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('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % 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, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c++ 设计模式(一)

我也是不经意间看到的,之前也学习过设计模式,只不过总是觉得“纸上得来终觉浅”,总要动手实践一下才会有所体会和感悟。 如果英语还可以的话就看这个:JakubVojvoda/design-patterns-cpp 如果英语比较菜就看这个:liu-jianhao/Cpp-Design-Patterns 参考:分享几个适合初学者的C语言/C++开源项目!涉及从基础语法到算法 另外还看到一个比较好的c项目(不是设计模式):AllAlgorithms/c ...

juluwangriyue的博客 193

cpp设计模式学习总结

。。。

Go_hack的博客 744

Cpp设计模式及举例

C++设计模式之单例模式 C++设计模式之工厂模式 C++设计模式之代理模式 C++设计模式之外观模式 C++设计模式之适配器模式 C++设计模式之模板方法模式 C++设计模式之策略模式 C++设计模式之命令模式 C++设计模式之观察者模式 C++设计模式之装饰模式 ...

weixin_44754751的博客 512

设计模式C++实现详解

《设计模式C++实现》是一个GitHub上的开源项目,由Jakub Vojvoda维护,它提供了C++中23种经典设计模式的实现和示例。这个项目的目标是帮助开发者更好地理解和运用这些设计模式,以便在软件开发中提高代码质量、可维护性和可扩展性。这些设计模式源自“Gang of Four”的著作《设计模式:可复用面向对象软件的基础》。 ## 2. 项目快速启动 ### 安装依赖 确保你的系统安装...

gitblog_00338的博客 539

c++ 24种设计模式

C++ 常用设计模式(学习笔记) 设计模式 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。...

qq_37871669的博客 2435

【C++】设计模式

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 & 减少子类个数)。将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。

IdealSanX的博客 1426

C++设计模式系列

C++设计模式——简单工厂模式 C++设计模式——工厂方法模式 C++设计模式——抽象工厂模式 C++设计模式——单例模式 C++设计模式——建造者模式 C++设计模式——原型模式 C++设计模式——适配器模式 C++设计模式——桥接模式 C++设计模式——组合模式 C++设计模式——装饰模式 C++设计模式——外观模式 C++设计模式——享元模式 C++设计模式——代理模...

CoderAldrich的专栏 2万+
上一篇: 牛客C++笔记——排序
下一篇: 硬件常见接口
MUCH_WAY
博客等级 码龄8年 25粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值