C++软件开发规范

详解 C/C++ 各大编程规范 详解 Google C++ Style Guide、C++ Core Guidelines、MISRA 以及腾讯、华为、360 等各大 C/C++ 编程规范 阅读详情
这个编程规范是我们自己做项目时,根据google c++编程规范改写的,适合小型项目使用,给大家分享一下。

头文件 

通常,每一个.cc文件(C++的源文件)都有一个对应的.h文件(头文件),也有一些例外,如单元测试代码和只包含main()的.cc文件。 

1. #define保护 

所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命名格式为:___H_

 为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。例如,项目foo中的头文件foo/src/bar/baz.h挄如下方式保护: 

#ifndef FOO_BAR_BAZ_H_

#define FOO_BAR_BAZ_H_ 

... 

#endif // FOO_BAR_BAZ_H_ 

2. 头文件依赖 使用前置声明(forward declarations)尽量减少.h文件中#include的数量。 

注:能依赖声明的就不要依赖定义。 

3. 内联函数 叧有当函数叧有10行甚至更少时才会将其定义为内联函数(inline function)。 

4. 函数参数顺序(Function Parameter Ordering) 定义函数时,参数顺序为:输入参数在前,输出参数在后。 

5. 包含文件的名称及次序 将包含次序标准化可增强可诺性、避免隐藏依赖(hidden dependencies,注:隐藏依赖主要是指包含的文件编译),次序如下:C库、C++库、其他库的.h、项目内的.h。 项目内头文件应挄照项目源代码目彔树结极排列,幵丏避免使用UNIX文件路径.(当前目录)和..(父目录)。例如,google-awesome-project/src/base/logging.h应像返样被包含: #include "base/logging.h" 

dir/foo.cc的主要作用是执行或测试dir2/foo2.h的功能,foo.cc中包含头文件的次序如下: 

dir2/foo2.h(优先位置,详情如下) 

C系统文件 

C++系统文件 

其他库头文件 

本项目内头文件 

返种排序方式可有效减少隐藏依赖,我们希望每一个头文件独立编译。最简单的实现方式是将其作为第一个.h文件包含在对应的.cc中.

 

作用域 

不要使用using提示符。 

 

C++类 

1. 构造函数(Constructor)的职责 构造函数中只进行那些没有实际意义的(注:简单初始化对于程序执行没有实际的逻辑意义,因为成员变量的“有意义”的值大多不在极造函数中确定)初始化,可能的话,使用Init()方法集中初始化为有意义的(non-trivial)数据。 

2. 默认构造函数(Default Constructors) 如果一个类定义了若干成员变量又没有其他构造函数,需要定义一个默认构造函数,否则编译器将自动生产默认构造函数。

3. 明确的构造函数(Explicit Constructors) 对单参数构造函数使用C++关键字explicit。 

4. 拷贝构造函数(Copy Constructors) 仅在代码中需要拷贝一个类对象的时候使用拷贝构造函数;不需要拷贝时应使用DISALLOW_COPY_AND_ASSIGN。 

5. 结构体和类(Structs vs. Classes) 仅当叧有数据时使用struct,其它一概使用class。 如果需要更多的函数功能,class更适合,如果不确定的话,直接使用class。 如果不STL结合,对于仿函数(functors)和特性(traits)可以不用class而是使用struct。 

注意:类和结构体的成员变量使用不同的命名规则。 

6. 继承(Inheritance) 使用组合(composition,注,这一点也是GoF在《Design Patterns》里反复强调的)通常比使用继承更适宜,如果使用继承的话,叧使用公共继承。 

7、接口(Interface) 接口是指满足特定条件的类,返些类以Interface为后缀(非必需)。 

8、操作符重载(Operator Overloading) 除少数特定环境外,不要重载操作符。

9、存取控制(Access Control) 将数据成员私有化,幵提供相关存取函数,如定义变量foo_及取值函数foo()、赋值函数set_foo()。 存取函数的定义一般内联在头文件中。 参考继承和函数命名。  

10、声明次序(Declaration Order) 在类中使用特定的声明次序:public:在private:之前,成员函数在数据成员(变量)前。 

定义次序如下:public:、protected:、private:,如果那一块没有,直接忽略即可。 

每一块中,声明次序一般如下: 

1) typedefs和enums; 

2) 常量; 

3) 构造函数; 

4) 析构函数; 

5) 成员函数,含静态成员函数; 

6) 数据成员,含静态数据成员。 

宏DISALLOW_COPY_AND_ASSIGN置于private:块之后,作为类的最后部分。参考拷贝构造函数。 .cc文件中函数的定义应尽可能和声明次序一致。 

不要将大型函数内联到类的定义中,通常,叧有那些没有特别意义的戒者性能要求高的,并且是比较短小的函数才被定义为内联函数。更多绅节参考译文第一篇的内联函数。 

11、编写短小函数(Write Short Functions) 倾向于选择短小、凝练的函数。 

 

其他C++特性 

1. 引用参数(Reference Arguments) 所有按引用传递的参数必须加上const。 

2. 函数重载(Function Overloading) 仅在输入参数类型不同、功能相同时使用重载函数(含构造函数),不要使用函数重载模仿缺省函数参数。 

3. 缺省参数(Default Arguments) 禁止使用缺省函数参数。 

4. 变长数组和alloca(Variable-Length Arrays and alloca()) 禁止使用变长数组和alloca()。 

5. 友元(Friends) 允许合理使用友元类及友元函数。 

6. 异常(Exceptions) 不要使用C++异常。 

7. 运行时类型识别(Run-Time Type Information, RTTI) 我们禁止使用RTTI。 

8. 类型转换(Casting) 使用static_cast<>()等C++的类型转换,不要使用int y = (int)x戒int y = int(x);。 

9. 流(Streams) 叧在记录日志时使用流。 

10. 前置自增和自减(Preincrement and Predecrement) 对于迭代器和其他模板对象使用前缀形式(++i)的自增、自减运算符。 

11. const的使用(Use of const) 我们强烈建议你在任何可以使用的情冴下都要使用const。 

const位置: 

有人喜欢int const *foo形式不喜欢const int* foo,他们认为前者更加一致因此可诺性更好:遵循了const总位亍其描述的对象(int)之后的原则。但是,一致性原则不适用于此,“不要过度使用”的权威抵消了一致性使用。将const放在前面才更易读,因为在自然诧言中形容词(const)是在名词(int)之前的。 这是说,我们提倡const在前,并不是要求,但要兼顼代码的一致性! 

12. 整型(Integer Types) C++内建整型中,唯一用到的是int,如果程序中需要不同大小的变量,可以使用中的精确宽度(precise-width)的整型,如int16_t。对于大整数,使用int64_t。不要使用uint32_t等无符号整型,除非你是在表示一个位组(bit pattern)而不是一个数值。即使数值不会为负值也不要使用无符号类型,使用断言(assertion,译者注,这一点很有道理,计算机叧会根据变量、返回值等有无符号确定数值正负,仍然无法确定对错)来保护数据。 

13. 预处理宏(Preprocessor Macros) 使用宏时要谨慎,尽量以内联函数、枚举和常量代替之。 宏意味着你和编译器看到的代码是不同的,因此可能导致异常行为,尤其是当宏存在于全局作用域中。

14. 0和NULL(0 and NULL) 整数用0,实数用0.0,指针用NULL,字符(串)用'\0'。 整数用0,实数用0.0,这一点是毫无争议的。 对于指针(地址值),到底是用0还是NULL,Bjarne Stroustrup建议使用最原始的0,我们建议使用看上去像是指针的NULL,事实上一些C++编译器(如gcc 4.1.0)与门提供了NULL的定义,可以给出有用的警告,尤其是sizeof(NULL)和sizeof(0)不相等的情况。 字符(串)用'\0',不仅类型正确而且可读性好。 

15. sizeof(sizeof) 尽可能用sizeof(varname)代替sizeof(type)。 使用sizeof(varname)是因为当变量类型改变时代码自动同步,有些情况下sizeof(type)或许有意义,迓是要尽量避免,如果变量类型改变的话不能同步。  

 

命名约定 

1. 通用命名规则(General Naming Rules) 函数命名、变量命名、文件命名应具有描述性,不要过度缩写,类型和变量应该是名词,函数名可以用“命令性”动词。 

如何命名: 尽可能给出描述性名称,不要节约空间,让别人很快理解你的代码更重要,好的命名选择: 

int num_errors; // Good. 

int num_completed_connections; // Good. 

类型和变量名一般为名词:如FileOpener、num_errors。 

函数名通常是指令性的,如OpenFile()、set_num_errors(),访问函数需要描述的更细致,要不其访问的变量相吻合。 

缩写: 除非放到项目外也非常明了,否则不要使用缩写

不要用省略字母的缩写: 

int error_count; // Good. 

int error_cnt; // Bad. 

2. 文件命名(File Names) 

文件名要全部小写,可以包含下划线(_)或短线(-),按项目约定来。 通常,尽量让文件名更加明确,http_server_logs.h就比logs.h要好,定义类时文件名一般成对出现,如foo_bar.h和foo_bar.cc,对应类FooBar。 

3. 类型命名(Type Names) 类型命名每个单词以大写字母开头,不包含下划线:MyExcitingClass、MyExcitingEnum。 所有类型命名——类、结构体、类型定义(typedef)、枚举——使用相同约定

4. 变量命名(Variable Names) 变量名一徇小写,单词间以下划线相连,类的成员变量以下划线结尾,如my_exciting_local_variable、my_exciting_member_variable_。 全局变量: 对全局变量没有特别要求,少用就好,可以以g_或其他易与局部变量区分的标志为前缀。 

5. 常量命名(Constant Names) 在名称前加k:kDaysInAWeek。 所有编译时常量(无论是尿部的、全尿的还是类中的)和其他变量保持些许区别,k后接大写字母开头的单词

6. 函数命名(Function Names) 普通函数(regular functions,译者注,返里不访问函数等特殊函数相对)大小写混合,存取函数(accessors and mutators)则要求不变量名匹配:MyExcitingFunction()、MyExcitingMethod()、my_exciting_member_variable()、set_my_exciting_member_variable()。 普通函数: 函数名以大写字母开头,每个单词首字母大写,没有下划线

 

代码注释 

1. 注释风格(Comment Style) 使用//或,统一就好。 //或都可以,//叧是用的更加广泛,在如何注释和注释风格上确保统一。 

2. 文件注释(File Comments) 在每一个文件开头加入版权公告,然后是文件内容描述。 法徇公告和作者信息: 每一文件包含以下项,依次是: 

1) 版权(copyright statement):如Copyright 2008 Google Inc.; 

2) 许可版本(license boilerplate):为项目选择吅适的许可证版本,如Apache 2.0、BSD、LGPL、GPL; 

3) 作者(author line):标识文件的原始作者。 

如果你对其他人创建的文件做了重大修改,将你的信息添加到作者信息里,这样当其他人对该文件有疑问时可以知道该联系谁。 

3. 类注释(Class Comments) 每个类的定义要附着描述类的功能和用法的注释。 

4. 函数注释(Function Comments) 函数声明处注释描述函数功能,定义处描述函数实现。 函数定义: 每个函数定义时要以注释说明函数功能和实现要点,如使用的漂亮代码、实现的简要步骤、如此实现的理由、为什么前半部分要加锁而后半部分不需要。 不要从.h文件或其他地方的函数声明处直接复制注释,简要说明函数功能是可以的,但重点要放在如何实现上。 

5. 变量注释(Variable Comments) 通常变量名本身足以很好说明变量用途,特定情冴下,需要额外注释说明。 类数据成员: 每个类数据成员(也叫实例变量或成员变量)应注释说明用途,如果变量可以接受NULL戒-1等警戒值(sentinel values),须说明之。

6. 实现注释(Implementation Comments) 对亍实现代码中巧妙的、晦涩的、有趣的、重要的地方加以注释。 

7. 标点、拼写和语法(Punctuation, Spelling and Grammar) 留意标点、拼写和语法,写的好的注释比差的要易读的多。 注释一般是包含适当大写和句点(.)的完整的句子,短一点的注释(如代码行尾的注释)可以随意点,依然要注意风格的一致性。完整的句子可读性更好,也可以说明该注释是完整的而不是一点不成熟的想法。 虽然被别人指出该用分号(semicolon)的时候用了逗号(comma)有点尴尬。清晰易读的代码还是很重要的,适当的标点、拼写和语法对此会有所帮助。 

 

格式 

1. 行长度(Line Length) 每一行代码字符数不超过80。 

2. 非ASCII字符(Non-ASCII Characters) 尽量不使用非ASCII字符,使用时必须使用UTF-8格式。 

3. 直接使用tab,将tab设置为4. 

4. 函数声明与定义(Function Declarations and Definitions) 返回类型和函数名在同一行,合适的话,参数也放在同一行。 

注意以下几点: 

1) 返回值总是和函数名在同一行; 

2) 左圆括号(open parenthesis)总是和函数名在同一行;

3) 函数名和左圆括号间没有空格; 

4)圆括号与参数间没有空格; 

5) 左大括号(open curly brace)总在最后一个参数同一行的末尾处; 

6) 右大括号(close curly brace)总是单独位于函数最后一行; 

7) 右圆括号(close parenthesis)和左大括号间总是有一个空格; 

8) 函数声明和实现处的所有形参名称必须保持一致; 

9) 所有形参应尽可能对齐; 

10) 缺省缩进为2个空格; 

11) 独立封装的参数保持4个空格的缩进。 

5. 函数调用(Function Calls) 尽量放在同一行,否则,将实参封装在圆括号中。  

6. 条件语句(Conditionals) 更提倡不在圆括号中添加空格,关键字else另起一行。 

7. 循环和开关选择语句(Loops and Switch Statements) switch语句可以使用大括号分块;空循环体应使用{}或continue。 

8. 指针和引用表达式(Pointers and Reference Expressions) 

句点(.)或箭头(->)前后不要有空格,指针/地址操作符(*、&)后不要有空格。 = + - * /  && || 等运算符前后各空一空格。

9. 函数返回值(Return Values) return表达式中不要使用圆括号。 

10. 变量及数组初始化(Variable and Array Initialization) 选择=还是()。 

11. 预处理指令(Preprocessor Directives) 预处理指令不要缩进,从行首开始。 

12. 类格式(Class Format) 声明属性依次序是public:、protected:、private:,每次缩进1个空格(译者注,为什么不是两个呢?也有人提倡private在前,对于声明了哪些数据成员一目了然,还有人提倡依逻辑关系将变量与操作放在一起,都有道理:-))。 

13. 命名空间格式化(Namespace Formatting) 命名空间内容不缩迕。 

14. 水平空白(Horizontal Whitespace) 水平空白的使用因地制宜。不要在行尾添加无谓的空白。 

15. 垂直空白(Vertical Whitespace) 垂直空白越少越好。 这不仅仅是规则而是原则问题了:不是非常有必要的话就不要使用空行。尤其是:不要在两个函数定义之间空超过2行,函数体头、尾不要有空行,函数体中也不要随意添加空行。 

【C/C++ 软件开发模拟面试 集】C++ 编程规范 相关知识点模拟面试 阅读详情

相关推荐

NLP实践——利用自己的语料进行Mask Language Model预训练

#!/usr/bin/env python # coding: utf-8 # In[1]: import os import json import copy from tqdm.notebook import tqdm import torch from torch.optim import AdamW from torch.utils.data import DataLoader, Dataset from transformers import BertForMaskedLM, BertTo

weixin_44826203的博客 1万+

C++常用开发规范

c++谷歌开发规范

武当山道士的博客 1382

Simulink Test Sequence自动化测试实战:从Excel到模型验证

本文详细介绍了如何利用Excel和MATLAB脚本实现Simulink Test Sequence的自动化测试。通过设计结构化Excel模板管理测试数据,并调用Simulink Test API批量创建与执行测试用例,该方法能显著提升复杂模型单元测试的效率,便于集成到CI/CD流程,实现从数据到验证的全自动化。

weixin_29261711的博客 144

C++_开发_项目开发编码规范

C++_开发_项目开发编码规范

qq_44681788的博客 4507

单精度浮点数存储、双精度浮点数存储

单精度浮点数存储、双精度浮点数存储

fancynthia的博客 1305

STM32F4用FSMC驱动AX58100 EtherCAT从站芯片,保姆级配置流程与避坑指南

本文详细介绍了STM32F4通过FSMC接口驱动AX58100 EtherCAT从站芯片的完整配置流程,包括硬件连接、时序优化、协议栈移植及TwinCAT主站集成。针对工业自动化场景,提供高性价比的实时控制解决方案,特别适合机械臂、CNC机床等精确同步应用,并分享关键调试技巧与性能优化方法。

weixin_27869497的博客 305

C/C++工程项目开发规范

C/C++工程项目开发规范 函数的声明与定义 声明:告诉系统有一个函数,可以重复声明。 定义:函数具体是如何实现的,不可以重复。 其报错位置: 源程序—预编译------->***编译(未声明)***—生成对象问件.o---------> 链接(未定义) —>可执行文件 将函数的声明与定义写在一起 #include<stdio.h> int add(int a, int b) { return a+b; } int main() { add(2, 3);

千余千行 888

手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控

本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例和错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。

weixin_30919429的博客 163

【亲测免费】 C++项目结构规范示例教程

C++项目结构规范示例教程 1. 项目的目录结构及介绍 本项目采用规范的C++工程目录结构,旨在提供一个清晰、易于维护的代码组织方式。以下是项目的顶层目录结构及其介绍: project_name ├── deploy ├── build ├── doc ├── 3rdparty ├── include │ └── project_name ├── project_name ├── tools ...

gitblog_00706的博客 1231

通用、可复用的 AI Skill 开发基本流程

-----name:唯一标识符(建议用领域-功能格式):自然语言描述触发条件(AI 依赖此判断是否激活)tags(可选):便于分类和搜索version:支持后续迭代步骤输出物1. 定范围触发场景描述2. 写元数据name3. 填内容结构化 Markdown 文件4. 做验证可运行 + 符合规范5. 去集成放入对应 IDE 目录6. 持续维护跟进框架更新通过这套流程,你不仅可以开发(Hooks 最佳实践)(原生 WebGL 优化)(Pandas/Numpy 高效写法)

lpfasd123的博客 721

分布式系统中的“无状态”和“有状态”详解

有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如 tomcat 中的 session。例如登录:用户登录后,我们把登录者的信息保存在服务端 session 中,并且给用户一个 cookie 值,记录对应的 session。然后下次请求,用户携带 cookie 值来,我们就能识别到对应 session,从而找到用户的信息。

AI天才研究院 2万+

C++软件开发规范-续

4 函数设计函数是C++/C程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的。本章重点论述函数的接口设计和内部实现的一些规则。函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer)。C++ 语言中多了引用传递(pass by

312

使用Gitlab 搭建私有镜像仓库(外置Nginx)

为了让团队尽快使用Gitlab的CI进行工作,必须做好Gitlab的初始化工作,大家都知道拉取镜像由于某些原因,会比较慢,因此构建自己的私有镜像仓库就成为了关键的一步。当然私有镜像仓库的搭建有很多种方式,这里直接使用Gitlab提供的镜像仓库功能。一揽子解决方案比较香。gitlab真的越来越好用了,有了这个镜像仓,也没必要再使用三方的镜像仓库了。Devops 真好用!

网尘的技术专栏 1829

C++软件开发规范(二)

2 命名规则比较著名的命名规则当推“匈牙利” 命名法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。“匈牙利”法最大的缺点是烦琐,例如int    i,  j,  k;  float  x,  y,  z;倘若采用“匈牙利”命名规则,

303

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深度学习工具包 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")

c/c++软件开发规范(转)

在研究项目团队协作开发的情况下(这里的团队协作也适合于应用项目的开发),编程时应该强调的一个重要方面是程序的易读性,在保证软件速度等性能指标能满足用户需求的情况下,能让其他程序员容易读懂你所编写的程序。若研究项目小组的所有开发人员都遵循统一的、鲜明的一套编程风格,可以让协作者、后继者和自己一目了然,在很短的时间内看清楚程序结构,理解设计的思路,大大提高代码的可读性、可重用性、程序健壮性、可移植性、...

weixin_30770783的博客 162

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++软件开发规范(三)

3.3 代码行内的空格☆       【规则3.3-1】      关键字之后要留空格,象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字, 象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字;☆       【规则3.3-2】      函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别;☆    

300

Camera2Demo

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

C++软件开发规范-续(二)

assert不是一个仓促拼凑起来的宏。为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。如果程序在assert处终止了,并不是说含有该assert的函数有错误,而是调用者出了差错,assert可以帮助我们找到发生错误的原因。  ☆    

309

谷歌代码规范的中文版

谷歌代码规范的中文版 https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/

dbdxnuliba的博客 1973

c++ try catch语句_知名半导体MCU大厂软件开发C代码规范

  本文讲解的是飞思卡尔软件开发C语言编码规范。来自于痞子衡嵌入式公众号,下面是编码规范原文:1.引言  制定此编码风格指导手册的目的是为了使按此规范编写出的C/C++代码极易被阅读和理解。2.与其他编码风格对比3.基本排版格式需要以4个空格为单位的缩进.坚决不用Tab键,要用空格键.所有文件结尾必须空一行.文本文件必须用UTF-8编码.每一行不能超过100个字符.4.文档与注释恰当地进...

weixin_39809540的博客 235

【汽车行业方案】Parasoft面向AUTOSAR C++ 编码规范的软件开发质量管理方案

作为全球知名的软件测试与质量管理解决方案提供商,Parasoft 提供面向 AUTOSAR C++ 编码规范的软件质量管理支持方案,帮助汽车软件团队在项目全生命周期中建立更系统化的质量控制机制。

开发者效率提升工具的博客 385

软件开发规范

软件开发规范在研究项目团队协作开发的情况下(这里的团队协作也适合于应用项目的开发),编程时应该强调的一个重要方面是程序的易读性,在保证软件速度等性能指标能满足用户需求的情况下,能让其他程序员容易读懂你所编写的程序。若研究项目小组的所有开发人员都遵循统一的、鲜明的一套编程风格,可以让协作者、后继者和自己一目了然,在很短的时间内看清楚程序结构,理解设计的思路,大大提高代码的可读性、可重用性、程序健壮性...

weixin_33816611的博客 117

Google公开C++编码规范

<br />链接地址:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

冰峰的专栏 636

Visual C++ 编码规范

1.说明执行本规范的目的在于保证编码的规范性、和确保代码质量,提高软件代码的可读性、可修改性,避免在开发和调试过程中出现不必要的麻烦。此外,还可以统一代码风格,便于研发人员之间的技术交流。 2.适用范围本标准适用于使用Visual C++进行软件程序开发的人员。 3.编码的基本要求n         程序结构清晰,逐步求精,单个函数的程序行数一般不超过100行。n 

truewaylee的专栏 2470

C++编程命名规范

在软件开发过程中,代码的命名规范是一项很突出的内容。一套定义完整、结构清晰明了的命名规范将大大提升源代码的可读性和软件的可维护性。据考证,没有一种命名规则可以让所有的程序员都满意,程序设计教科书一般也不会指定命名规则。但是制定一套令开发组成员基本满意的命名规则,并在项目中贯彻实施,也是团队开发一项必不可少的工作。我将我的团队的实际工作中的命名规则整理如下:第一部分:共性规则共有八项。作为指导供成员...

weixin_30247159的博客 380

c++软件开发心得

c++软件开发心得 这个学期的c++学习马上结束了,和上一个学期相比是完全不同的体验,开始进行了软件设计开发,在老师的引领下,尝试了几个简单的软件设计,有学生成绩管理系统、ATM机系统、通讯录还有最后的图书管理系统,在研究学习这几个系统的过程中,有了很多收获,也初步认识到程序设计的一个雏形。 首先接触一个设计,先明确思路,罗列需求和功能,然后把整体的框架构造出来,再去思考细节的处理。万事开头难...

weixin_43460331的博客 374
上一篇: 【区别总结】C、Java和脚本语言区别
下一篇: Eclipse下导入外部jar包的3种方式
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值