#ifdef __cplusplus extern "C" { #endif 的细节原理

C语言中的 #ifdef __cplusplus 和 #endif 的作用 C/C++ 语言是一种静态编译语言,编译器在编译代码之前,会先对源代码进行预处理,这些预处理指令是以 # 开头的特殊指令,用来指示编译器完成某些特定的任务。常见的预处理指令包括#define#ifdef#ifndef#include#pragma等。在编译源程序的时候,编译器首先会处理源程序中的预处理指令,将预处理指令替换成相应的代码,最终生成编译后的代码。在编译后的代码中,预处理指令的代码已经被展开或忽略,直接参与编译和链接。 阅读详情
原文转载: 点击打开链接
#ifdef __cplusplus extern "C" { #endif 的解释

1、在好多程序中我们会遇到下面代码段

#ifdef __cplusplus
        extern "C" {
        #endif

//c语法代码段

#ifdef __cplusplus
        }
        #endif //

首先应该知道,__cplusplus是CPP中的自定义宏,则表示这是一段cpp的代码,编译器按c++的方式编译系统.。如果这时候我们需要使用c语言的代码,那么就需要加上(extern "C" { )这一段来说明,要不编译器会把c代码按c++模式编译,会出现问题。

这句话的意思是:这个代码是CPP的代码,__cplusplus是cpp中的自定义宏,因此,以CPP语言的形式编译,但是里面的代码有C语言的代码,那么就要“extern "C" { ”说明一下,编译器用C语言的模式编译。

#ifdef __cplusplus //c++编译环境中才会定义__cplusplus (plus就是"+"的意思)
        extern"C"{ /告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)
        #endif

要明白为何使用extern "C"{,还得从CPP中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等。而在C中,只是简单的函数名字而已,不会加入其他的信息。也就是说:C++和C对产生的函数名字的处理是不一样的。 加上extern "C"{ 目的,就是主要实现C与C++的相互调用问题。

extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

1、C++ 调用C中函数的实例:

c.h的实现

#ifndef _c_h_
        #define _c_h_

        #ifdef __cplusplus
        extern "C" {
                #endif

                void C_fun();

                #ifdef __cplusplus
        }
        #endif

        #endif
        -----------------------------------

c.c的实现

#include "c.h"
        void C_fun()
        {
        }

------------------------------------

在cxx.cpp中调用c.c中的C_fun()

cxx.cpp的实现

#include "c.h"
        int main()
        {
                C_fun()
        }

C++调用C的函数时,在c++的 .h 文件中加extern "C" {}。

所以关键是extern "C" {} ,extern "C"是告诉C++编译器件括号里的东东是按照C的obj文件格式编译的,要连接的话按照C的命名规则去找。

2、C调用C++中的函数CPP_fun()

因为先有C后有C++,所以只能从C++的代码中考虑了。加入C++中的函数或变量有可能被C中的文件掉用,则应该这样写,也是用extern "C"{},不过是代码中要加,头文件也要加,因为可能是C++中也调用

Cxx.h的实现

#ifndef _c_h_
        #define _c_h_

        #ifdef __cplusplus
        extern "C" {
                #endif

                void CPP_fun();

                #ifdef __cplusplus
        }
        #endif

        #endif

Cxx.cpp的实现

extern "C" { //告诉C+++编译器,扩号里按照C的命名规则编译
                void CPP_fun()
                {
                        .....
                }
        }

c.c的实现

#include "Cpp.h"
        int main()
        {
                CPP_fun()
        }

总结:C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。

重要补充:如果C++调用C代码,需要在头文件.h中,添加:

extern "C" {

//C 代码声明;

}

在C代码的实现代码中,有两种方式:

1. 直接修改文件名XXX.c,直接实现,不需要添加extern "C" 声明;

2.如果对于XXX.cpp文件,则需要如下定义:

extern "C" {

//C 代码定义;

}





#ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #endif 解读 一般的样式是这样的:#ifdef __cplusplusextern "C"{#endif.......#ifdef __cplusplus}#endif 首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入"extern "C"{"  和 " }"处理其中的代码,其中{ }内部的代码是通过... 阅读详情

相关推荐

C/C++编程中extern与extern “C“的深度解析与工程实践

在C/C++多文件编程与混合语言开发中,理解符号的声明、定义与链接过程是解决复杂工程问题的关键基础。编译器在编译阶段处理单个源文件,而链接器则负责将多个目标文件中的符号引用与定义关联起来,生成最终可执行程序。这一机制的核心价值在于实现代码的模块化、复用与跨语言协作,广泛应用于大型项目构建、第三方库集成以及系统级软件开发等场景。其中,extern关键字用于声明外部链接的变量或函数,解决多文件间的全局符号共享问题;而extern "C"链接规范则专门处理C与C++编译器间因名字修饰规则差异导致的符号匹配难题,是

weixin_33811539的博客 304

#ifdef __cplusplus extern “C“{ #endif的作用

https://www.cnblogs.com/HappyXie/archive/2011/01/07/1929369.html

weixin_42031299的博客 7155

C/C++ extern关键字详解:解决未定义引用与跨文件函数调用

在C/C++程序开发中,编译与链接是两个核心构建阶段。编译阶段将每个源文件独立转换为目标文件,而链接阶段则负责将多个目标文件合并为最终可执行程序。这一过程的核心挑战在于符号解析,即确保函数和变量在不同编译单元间的正确引用。extern关键字在此扮演关键角色,它声明函数或变量具有外部链接属性,告知编译器其定义位于其他文件,由链接器最终解析。这一机制是实现代码模块化、支持多文件项目的基础。在C++与C混合编程场景中,由于C++的名称修饰特性,需使用extern "C"指令确保符号兼容性。理解extern的原理与

weixin_30266885的博客 327

#ifdef __cplusplus extern "C" { #endif 的解释

作者:宋老师,华清远见嵌入式学院讲师。 1、在好多程序中我们会遇到下面代码段 #ifdef __cplusplus extern "C" { #endif //c语法代码段 #ifdef __cplusplus } #endif // 首先应该知道,__cplusplus是CPP中的自定义宏,则表示这是一段cpp的代码,编译器按c++的方式编译系统.。如果这时候我们需要使用c

farsightliuht的专栏 1466

嵌入式开发实战:C语言调用C++函数的完整解决方案与原理剖析

在嵌入式系统开发中,C语言因其高效、可预测性成为底层驱动和实时操作系统的首选。然而,随着项目复杂度提升,C++的面向对象特性、模板和标准库在算法和模块封装上展现出显著优势。理解编译链接原理,特别是名字修饰和二进制接口差异,是实现跨语言调用的技术基础。通过extern "C"链接规范和不透明指针技术,可以构建稳定的C兼容接口,使C代码安全调用C++对象。这种混合编程模式在资源受限的嵌入式场景下,既能保持底层效率,又能利用C++的高级特性提升复杂模块的开发质量与可维护性,是平衡性能与工程实践的典型方案。

weixin_34310369的博客 379

杰理AC632N开发板按键配置与GPIO关机保护详解(附CodeBlocks头文件修改避坑)

本文详细解析了杰理AC632N开发板的按键配置与GPIO关机保护实战技巧,包括结构体修改、CodeBlocks头文件缓存问题解决、GPIO保护策略及定时器选择等关键内容。特别提供了充电唤醒实现细节和混合编程注意事项,帮助开发者避开常见陷阱,提升开发效率。

aocan6909的博客 532

关于 #ifdef __cplusplus extern “C“ { #endif

C/C++

holly的专栏 1468

C/C++链接错误multiple definition深度解析:从编译原理到工程实践

在C/C++项目开发中,编译与链接是构建可执行程序的核心环节。编译阶段将源代码转换为目标文件,生成符号表记录定义与引用;链接阶段则负责将多个目标文件拼接,解决符号引用关系。这一过程遵循ODR(One Definition Rule)原则,要求每个全局符号在程序中必须有且仅有一个定义。违反ODR会导致链接器报出multiple definition错误,这是影响项目健壮性的常见问题。理解符号的声明与定义区别、内部链接与外部链接机制,对于构建可维护的大型项目至关重要。本文以典型的DetectClassNameE

weixin_30417487的博客 355

深入解析extern “C“:解决C/C++混合编程链接问题的核心技术

在C/C++混合编程中,链接器报错是常见的技术挑战,其根源在于两种语言对函数名的处理机制不同。C语言采用简单的符号命名规则,而C++引入了名字修饰机制以支持函数重载、命名空间等高级特性,这导致编译后的符号名无法直接匹配。extern "C"作为链接指示符,能够强制C++编译器按照C语言的规则处理函数名,确保跨语言调用的符号一致性。这一技术对于集成第三方C库、实现底层驱动与上层应用的交互具有重要价值,特别是在嵌入式开发、音视频处理等需要高性能底层库的场景中。通过合理使用extern "C",开发者可以高效解决

weixin_30443747的博客 328

ARM嵌入式开发中跨编译器C调用C++库的ABI兼容性解决方案

在嵌入式系统开发中,不同编译器间的ABI(应用程序二进制接口)兼容性是混合编程的核心挑战。ABI定义了函数调用约定、内存布局和名称修饰等底层规范,直接影响二进制代码的互操作性。当使用ARM Compiler 6(如Keil MDK)开发的主程序需要调用Tasking编译器编译的C++静态库时,常因运行时库依赖和名称修饰规则差异导致链接错误。通过创建纯C封装层作为“二进制适配器”,将C++对象的构造/析构和异常处理隔离在单一编译器环境中,可构建稳定的跨编译器接口。这种方法在汽车电子和工业控制等领域具有重要价值

weixin_33843409的博客 467

LabVIEW与C++ DLL混合编程:原理、配置与实战优化指南

动态链接库(DLL)是Windows系统中实现代码复用和模块化的重要技术,它允许程序在运行时加载并调用预编译的函数库,从而提升开发效率和软件性能。其核心原理在于通过导出函数接口和标准调用约定,实现主程序与库之间的二进制交互。在工业自动化与测试测量领域,LabVIEW作为主流的图形化编程平台,常需集成高性能算法或复用现有C/C++代码库,此时通过调用库函数节点(CLFN)与C++ DLL进行混合编程便展现出巨大技术价值。这种架构结合了LabVIEW快速开发UI、处理数据流和硬件I/O的优势,以及C++执行高效

weixin_30699955的博客 389

深入理解extern “C“:解决C++与C语言混合编程的链接问题

在软件开发中,链接(Linking)是将多个编译后的目标文件合并为可执行程序的关键步骤。其核心原理在于解析符号引用,确保函数和变量的声明与定义正确匹配。C++语言支持函数重载等高级特性,编译器会通过名称修饰(Name Mangling)技术生成唯一的内部符号名,而C语言则采用简单的命名规则,这导致两者在二进制接口层面存在不兼容性。这种差异在混合编程场景下尤为突出,例如在嵌入式系统开发或调用遗留C库时,直接链接往往会产生“未定义符号”错误。extern "C"作为一种编译器指令,正是为了解决这一技术难题而设计

weixin_33713350的博客 346

利用Arcgis发布wmts服务

使用发布 GIS 服务连接连接到 ArcGIS Server 站点后,可以将各种 GIS 资源(如地图文档、数据库以及服务定义)发布到服务器上。此外,还可以添加、删除、启动和停止服务。使用管理 GIS 服务器连接到 ArcGIS Server 站点后,可以编辑各种服务器属性,例如配置存储位置、集群配置、参与到该站点中的计算机列表以及管理站点的数据存储。通过使用 GIS 服务连接建立连接后,可以查看并使用发布到该站点的服务。但不能编辑服务器或服务属性、发布服务,也不能添加、删除、启动、停止或暂停服务。

ghgfsasxda的博客 2392

Visual Studio中C/C++混合编程配置与extern “C“使用详解

在软件开发中,混合编程是一种常见的技术实践,它允许不同编程语言编写的模块在同一项目中协同工作。其核心原理在于解决不同编译器间的符号命名与链接规范差异,例如C++的名字修饰与C的简单符号命名规则。这种技术的价值在于能够充分利用现有成熟的C语言生态库,同时结合C++的现代特性进行高效开发。在实际应用场景中,常见于集成历史遗留的C语言库、调用硬件设备的C接口驱动,或在大型项目中实现模块化分工。通过使用extern "C"链接规范,可以明确告知C++编译器对特定代码段采用C语言的链接规则,从而避免链接错误。本文以V

weixin_30600197的博客 512

Unity面试题总结

Unity面试题

sinat_34014668的博客 1万+

stm32f407VET6 系统学习 day01 GPIO 配置

stm32f407VET6 系统学习 day01 GPIO 配置 LED 蜂鸣器 按键的不讲了,之前讲过了

she666666的博客 8904

C语言 extern 关键字实战:3个多文件项目案例解析与编译链接原理

本文深入解析C语言extern关键字在多文件项目中的实战应用,通过3个完整案例展示全局变量共享、模块间函数调用和头文件管理的技巧,并详细讲解编译链接原理。掌握extern的正确使用能有效提升C语言模块化开发能力,避免常见编译错误。

weixin_30905133的博客 352

华为OD面试八股文嵌入式C语言基础问题及答案(一)

本文总结了C语言编程中的10个关键知识点:1.宏定义MIN的实现方法;2.嵌入式无限循环的两种写法;3.变量a的8种不同定义方式;4.static关键字的三种作用;5.const关键字的含义和使用场景;6.volatile关键字的含义及三个应用实例;7.变量存储位置(栈区、静态区、堆区);8.32位系统指针位数;9.局部与全局变量重名规则;10.引用与指针的三点区别。这些内容涵盖了宏定义、变量声明、存储类别、指针等C语言核心概念,对嵌入式开发和系统编程具有重要参考价值。

m0_50382756的博客 160

C++ extern关键字详解:跨文件变量共享与C/C++混合编程

在C++编程中,理解变量和函数的声明与定义是构建大型项目的基石。声明告诉编译器符号的类型信息,而定义则分配内存或提供实现。extern关键字的核心作用是强制进行声明并指定外部链接属性,确保符号在不同编译单元间的可见性。这一机制对于实现代码模块化、管理全局变量以及优化编译过程具有重要技术价值。在实际工程中,extern常用于多文件共享全局变量和声明外部函数,特别是在C/C++混合编程场景下,extern "C"能解决因名称修饰规则不同导致的链接问题。本文深入解析extern在跨文件变量共享、链接属性控制以及C

weixin_33701294的博客 364

YOLOv9原创自研:卷积魔改 | 一种新颖的风车形卷积(PConv)融合注意力机制,加强微弱小目标检测能力

为了进一步提升小目标检测能力,风车形卷积(PConv)融合注意力机制进一步提升小目标检测能力

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 360

华为OD机试真题 新系统-字符串格式调整(C/C++/Py/Java/Js/Go)

华为OD机试 新系统真题【字符串格式调整】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串格式调整】多语言题解

qq_45776114的博客 1141

C/C++动态链接库开发:从符号导出到跨平台实战

在软件工程中,模块化开发与代码复用是提升开发效率的关键。动态链接库(DLL/SO)作为实现模块化的核心技术,其核心原理在于解决模块间的符号可见性问题——即如何让一个模块的函数或数据被其他模块“看见”并调用。这涉及到编译链接过程中的符号表管理、静态链接与动态链接的区别,以及运行时地址解析等底层机制。从技术价值看,动态链接不仅节省内存、便于更新,更是实现插件化架构、跨语言调用的基础。在应用场景上,无论是开发游戏引擎插件、封装算法库供Python调用,还是构建微服务架构中的共享组件,都离不开动态链接技术。本文聚焦

靓靓软件工作室 504

【异常】Python环境中没有安装 `openpyxl` 模块提示ModuleNotFoundError: No module named ‘openpyxl‘

是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的库。只是示例版本号,你可以根据需要选择不同的版本。安装完成后,再次尝试运行你的程序,应该就不会再出现。,这表明你的Python环境中缺少。运行一个Python程序时遇到了。如果由于某些原因你无法直接使用。,你可以指定版本号来安装,这里。要解决这个问题,你需要安装。

奶爸的编程之路,也就一周冷个三天 3396

C++设计原理——名称空间(使用、版本管理、别名、重载、嵌套、开放、对类的影响、与C语言的兼容)

C语言缺乏名称空间机制,导致全局名称容易冲突。常见解决方案包括使用宏定义添加前缀(如myprefix_f)或将全局实体封装到类中作为静态成员,但这会破坏封装性、改变初始化顺序并影响链接属性。C语言中可通过static关键字限制函数作用域到单个文件,避免跨文件冲突。C++引入namespace机制,允许将名称限定在特定空间内,通过A::String显式访问,或使用using声明/指令简化调用。相比C语言的解决方案,名称空间更灵活且不影响封装性,是C++管理全局名称的首选方式。

韩江雪de 小屋 373

18.EC实战 新建项目工程并配置各个引脚的工作方式(持续更新)

本博文介绍了从零开始新建EC工程及对各个引脚进行了工作模式的初始化配置

qq_30135687的博客 1731

深度学习工具包 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++ 设计模式1:单件模式
下一篇: 关于VS调试的几个小问题:Edit and Continue(ENC)
Walker Zhang
博客等级 码龄14年 144粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值