第一篇:优美的程序需要优美的子程序

Raptor 递归实战:子程序在最大公约数与数字和求解中的应用 本文通过Raptor工具详细讲解了递归和子程序在解决最大公约数(GCD)和数字和问题中的应用。文章结合具体实例,如辗转相除法和数字和统计,展示了递归的优雅和子程序的高效,帮助读者掌握这些编程利器。 阅读详情

第一篇:优美的程序需要优美的子程序

LinuxAid.com.cn  axing

〖 返回〗〖转发〗

    我见过那种一个main函数写了1000多行的程序员,而且为数还不在少数。难道说他们不懂得用函数吗?不见得,但可以肯定的一点是他们没有编写优美代码的意识。那么我们为什么需要子程序呢?我们来看看STEVE McCONNELL是怎么说的。

    以下是关于为什么要生成于程序的一些合理原因,其中有些原因之间可能有互相重叠的地方。

    降低复杂性。使用子程序的最首要原因是为了降低程序的复杂性,可以使用子程序来隐含信息,从而使你不必再考虑这些信息。当然,在编写子程序时,你还需要考虑这些信息。但是,一旦写好子程序,就可能不必再考虑它的内部工作细节,只要调用它就可以了。创建子程序的另外一个原因是尽量减小代码段的篇幅,改进可维护性和正确性。这也是一个不错的解释,但若没有子程序的抽象功能,将不可能对复杂程序进行明智的管理。

    一个子程序需要从另一个子程序中脱离出来的原因之一是,过多重数的内部循环和条件判断。这时,可以把这部分循环和判断从子程序中脱离出来,使其成为一个独立的子程序,以降低原有子程序的复杂性。

    避免代码段重复。无可置疑,生成子程序最普遍的原因是为了避免代码段重复。事实上,如果在两个不同子程序中的代码很相似,这往往意味着分解工作有误。这时,应该把两个子程序中重复的代码都取出来,把公共代码放入一个新的通用子程序中,然后再让这两个子程序调用新的通用子程序。通过使公共代码只出现一次,可以节约许多空间。这时改动也很方便,因为只要在一个地方改动代码就可以了。这时代码也更可靠了,因为只需在一个地方检查代码。而且,这也使得改动更加可靠,因为,不必进行不断地、非常类似地改动,而这种改动往往又是认为自己编写了相同的代码这一错误假设下进行的。

    限制了改动带来的影响。由于在独立区域进行改动,因此,由此带来的影响也只限于一个或最多几个区域中。要把最可能改动的区域设计成最容易改动的区域。最可能被改动的区域包括:硬件依赖部分、输入输出部分、复杂的数据结构和商务规则。

    隐含顺序。把处理事件的非特定顺序隐含起来是一个很好的想法。比如,如果程序通常先从用户那里读取数据,然后再从一个文件中读取辅助数据,那么,无论是读取用户数据的子程序,还是读取文件中数据的子程序,都不应该对另一个子程序是否读取数据有所依赖。如果利用两行代码来读取堆栈顶的数据,并减少一个Stacktop变量,应把它们放入一个PopStack()子程序中,在设计系统时,使哪一个都可以首先执行,然后编写一个子程序,隐含哪一个首先执行的信息。

    改进性能。通过使用子程序,可以只在一个地方,而不是同时几个地方优化代码段。把相同代码段放在子程序中,可以通过优化这一个子程序而使得其余调用这个子程序的子程序全部受益。把代码段放入子程序也使得用更快的算法或执行更快的语言(如汇编)来改进这段代码的工作变得容易些。

    进行集中控制。在一个地方对所有任务进行控制是一个很好的想法。控制可能有许多形式。知道一个表格中的入口数目便是其中一种形式,对硬件系统的控制,如对磁盘、磁带、打印机、绘图机的控制则是其中另外一种形式。使用子程序从一个文件中进行读操作,而使用另一个子程序对文件进行写操作便是一种形式的集中控制。当需要把这个文件转化成一个驻留内存的数据结构时,这一点是非常有用的,因为这一变动仅改变了存取子程序。专门化的子程序去读取和改变内部数据内容,也是一种集中的控制形式。集中控制的思想与信息隐含是类似的,但是它有独特的启发能力,因此,值得把它放进你的工具箱中。

    隐含数据结构。可以把数据结构的实现细节隐含起来,这样,绝大部分程序都不必担心这种杂乱的计算机科学结构,而可以从问题域中数据是如何使用的角度来处理数据。隐含实现细节的子程序可以提供相当高的抽象价值,从而降低程序的复杂程度。这些子程序把数据结构、操作集中在一个地方,降低了在处理数据结构时出错的可能性。同时,它们也使得在不改变绝大多数程序的条件下,改变数据结构成为可能。

    隐含全局变量。如果需要使用全局变量,也可以像前述那样把它隐含起来、通过存取子程序来使用全局变量有如下优点:不必改变程序就改变数据结构;监视对数据的访问;使用存取子程序的约束还可以鼓励你考虑一下这个数据是不是全局的;很可能会把它处理成针对在一个模块中某几个子程序的局部数据,或处理成某一个抽象数据的一部分。

    隐含指针控作。指针操作可读性很差,而且很容易引发错误。通过把它们独立在子程序中,可以把注意力集中到操作意图而不是机械的指针操作本身。而且,如果操作只在一处进行,也更容易确保代码是正确的。如果找到了比指针更好的数据结构,可以不影响本应使用指针的子程序就对程序作改动。

    重新使用代码段。放进模块化子程序中的代码段重新使用,要比在一个大型号程序中的代码段重新使用起来容易得多。计划开发一个程序族。如果想改进一个程序,最好把将要改动的那部分放进子程序中,将其独立。这样,就可以改动这个子程序而不致影响程序的其余部分,或者干脆用一个全新的子程序代替它。几年前,我曾经负责一个替保险推销员编写系列软件的小组,我们不得不根据每一个推销员的保险率、报价单格式等等来完成一个特定的程序。但这些程序的绝大部分又都是相同的:输入潜在客户的子程序,客户数据库中存储的信息、查看、计算价格等等。这个小组对程序进行了模块化,这样,随推销员而变化的部分都放在自己的模块中。最初的程序可能要用三个月的时间来开发,但是,在此之后,每来一个推销员,我们只改写其中屈指可数的几个模块就可以了。两三天就可能写完一个要求的程序,这简直是一种享受!

    提高部分代码的可读性。把一段代码放入一个精心命名的子程序,是说明其功能的最好办法。这样就不必阅读这样一段语句:
    if ( Node <> NULL )
        while ( Node.Next <> NULL ) do
            Node = Node.Next
        LeafName = Node.Name
    else
        LeafName = " "
    代替它的是:
    LeafName = GetleafName(Node)
    这个程序是如此简短,它所需要的注释仅仅是一个恰当的名字而已。用一个函数调用来代替一个有六行的代码段,使得含有这段代码的子程序复杂性大为降低,并且其功能也自动得到了注释。

    提高可移植性。可以使用子程序来把不可移植部分、明确性分析和将来的移植性工作分隔开来,不可移植的部分包括:非标准语言特性、硬件的依赖性和操作系统的依赖性等。

    分隔复杂操作。复杂操作包括:繁杂的算法、通信协议、棘手的布尔测试、对复杂数据的操作等等。这些操作都很容易引发错误。如果真的有错误,那么如果这个错误是在某个子程序中,而不是隐藏在整个程序中的话,查找起来要容易得多。这个错误不会影响到其它子程序,因为为了修正错误只要改动一个子程序就可以了。如果发现了一个更为简单迅速的算法,那么用它来代替一个被独立在子程序中的算法是非常容易的。在开发阶段,尝试几种方案并选择其
中一个最好的是非常容易的。

    独立非标准语言函数的使用。绝大多数实现语言都含有一些非标准的但却方便的扩展。使用这种扩展的影响是两面性的,因为在另外一个环境下它可能无法使用。这个运行环境的差异可能是由于硬件不同、语言的生产商不同、或者虽然生产商相同、但版本不同而产生的。如果使用了某种扩展,可以建立一个作为进入这种扩展大门的子程序。然后,在需要时,可以用订做的扩展来代替这一非标准扩展。

    简化复杂的布尔测试。很少有必要为理解程序流程而去理解复杂的布尔测试。把这种测试放入函数中可以提高代码的可读性,因为:
    (1) 测试的细节已经被隐含了。
    (2) 清楚的函数名称已经概括了测试目的。
    赋予这种测试一个函数,该函数强调了它的意义,而且这也鼓励了在函数内部增强其可读性的努力。结果是主程序流和测试本身都显得更加清楚了。是出于模块化的考虑吗吗?绝不是。有了这么些代码放入子程序的理由,这个理由是不必要的。事实上,有些工作更适合放在一个大的子程序中完成。

    看完了这一段对于使用子程序的说明,是不是觉得很神奇,以前从来没有想过使用子程序有如此多的好处。其实总结来说子程序的最大好处就是提高了系统的复用性(reusability)和可读性。这对于现代软件工程来说是至关重要的一点。复用性是什么样一个概念呢,我举一个书上的例子:

    在建房子中,你不会去建造那些你可以现成买来的东西,比如洗衣机、烘干机,电冰箱、吸尘器等,除非你是个机械迷。同时,你也会去购买已经做好的地毯、门、窗和浴室用品,而不是自己动手建。如果你正在建造一个软件,你也会这样做。你会推广使用高级语言的特点,而不是去编写操作系统一级的代码。你也会利用已经存在的显示控制和数据库处理系统,利用已经通过的子程序。如果样样都自己动手是很不明智的。

    如果你想修建一幢陈设一流的别墅,情况就不同了,你可能定做全套家具,因为希望洗碗机、冰箱等与你的协调一致,同时你还会定做别具风格的门和窗户。这种定做化的方式与一流软件开发也是非常类似的。为了这一目的,你可能创建精度更高、速度更快的科学公式。你也会设计自己的显示控制、数据库处理系统和自己的子程序,以使整个软件给人以一气呵成,天衣无缝的感觉。

    了解复用的好处了吗,有人描绘过未来软件的景象,你可以去软件市场上购买你需要的软件模块,然后加以组装就成为你所需要的软件产品了,相信吗?不信吗?我也是,不过也许真会有那么一天。

    在这一节里,我们看到了子程序的未来是一片光明,在接下来的的章节中,我们会对子程序的优美程度做一个讨论。

从“静”到“动”的跨越:用Abaqus UMAT子程序玩转Cohesive单元疲劳仿真(附避坑指南) 本文深入探讨了如何利用Abaqus UMAT子程序实现Cohesive单元疲劳仿真,解决了传统模型在循环载荷下的三大短板。通过详细的编程策略、调试验证方法和性能优化技巧,帮助工程师高效应对复合材料分层、粘接接头失效等复杂场景,并附有实用的避坑指南。 阅读详情

相关推荐

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5912

使用子程序的优点

子程序的作用:  1 降低复杂性:使用子程序的最首要原因是为了降低程序的复杂性,可以使用子程序来隐含 信息,从而使你不必再考虑这些信息。  2 避免代码段重复:无可置疑,生成子程序最普遍的原因是为了避免代码段重复。  3 限制改动带来的影响:由于在独立区域进行改动,因此,由此带来的影响也只限于一个或最多几个区域中。要把最可能改动的区域设计成最容易改动的区域。最可能被改动的区域包括:硬件依赖部

GRC 9181

Python学习24:中国古代数学问题——物不知数(Python123)

意思是说有一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;7个7个数也会多出2个。题目为‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?现假设物品总数不超过n (n

weixin_60530224的博客 2万+

为什么要使用子程序?

使用子程序,总得来说有两大好处。 第一个好处是,降低代码复杂度。 软件最应该考虑的问题是管理复杂度(5.2 key design concepts)。 使用子程序可以隐藏具体的实现细节,通过一个简单明了的函数名字即可知道函数的功能,有助于开发者集中精力解决主要问题。本质上是降低同一时间需要考虑的问题的复杂度。 第二个好处是减少冗余代码,简化修改难度。 详情请见《代

ghalcyon的博客 3187

Node.js内存溢出?一招搞定JavaScript heap out of memory错误(附永久配置方案)

本文深入解析Node.js内存溢出问题,提供从临时调整到永久配置的完整解决方案。重点介绍通过设置`max-old-space-size`参数和`NODE_OPTIONS`环境变量来扩展JavaScript堆内存限制,适用于Webpack、Vite等构建工具的大型项目场景,并涵盖Windows、Linux/macOS多平台配置方法。

cake8的博客 1055

CAN开发笔记(TI开发者推荐笔记)

查阅了很多资料没有查阅到关于5728芯片CAN模块寄存器的介绍,希望通过本文能给做CAN驱动的后来者有一点参考意义,我也是刚接触CAN模块有些不足请各位多多指正。 由下图所示是CAN模块初始化流程图 首先要开始初始化,设置CAN位时间,然后配置message objects, 完成初始化。 1.开始初始化 首先要控制DCAN_CTL 寄存器,该寄存器是CAN模块的总控制器,很多配置通过...

weixin_44316996的博客 3562

创建子程序的好处

小的子程序有许多优点,其一能够提高其可读性。例如以下代码在程序中的十多个地方出现: //伪代码 某种计算 points = deviceUnits * (POINTS_PER_INCH / DeviceUnitsPerInch() ); 这样我们可以重构以下,把其变成一个函数: Point DeviceUnitToPoints(const int deviceUnits) { Point po...

yangzijiangtou 1609

GD32F4系列Keil工程模板搭建全攻略(手把手教学版)

本文提供了一份详细的GD32F4系列Keil工程模板搭建指南。从软件安装、固件库获取、目录规划,到Keil工程创建、文件添加、关键配置(如编译器选项、头文件路径、时钟设置),再到代码定制与常见问题排查,手把手教你构建一个标准化、模块化的开发基础。文章重点介绍了如何利用官方固件库和代码模板,快速建立稳定高效的开发环境,适用于GD32F407等Cortex-M4内核芯片的入门与项目开发。

weixin_29159995的博客 428

【转贴】第一篇:优美的程序需要优美的子程序

我见过那种一个main函数写了1000多行的程序员,而且为数还不在少数。难道说他们不懂得用函数吗?不见得,但可以肯定的一点是他们没有编写优美代码的意识。那么我们为什么需要子程序呢?我们来看看STEVE McCONNELL是怎么说的。 以下是关于为什么要生成于程序的一些合理原因,其中有些原因之间可能有互相重叠的地方。 降低复杂性。使用子程序的最首要原因是为了降低程序的复杂性,可以使用子程序来隐含信息

lengxingfei的专栏 722

PX4控制云台的两种方式 方法适用控舵机 控灯

云台控制插件是mount_control,运行mavros启动文件的时候需要注意该插件是否正常启动,需要在px4_pluginlists.yaml配置文件中将mount_control从blacklisted中移除后才可启动。后会默认占用AUX端口1-4,此时通过AUX通道1-4输出PWM控制信号至云台,对应的RC通道映射功能失效。控制信号输入为RC 则接收机必须连接对应的通道至AUX辅助通道,并通过MNT_MAN_*参数设置pitch/roll/yaw对应的AUX通道。配置为AUTO或MAVLINK,

z1872385的博客 3668

46、搭建与配置FTP服务器全攻略

本文详细介绍了如何搭建与配置FTP服务器,以vsftpd为例,涵盖了FTP基础概念、安装步骤、服务控制、安全设置、用户权限管理、文件上传支持、互联网共享配置、客户端使用以及常见问题解决等内容。旨在帮助用户高效、安全地实现文件共享与管理。

time3的博客 88

使用子程序的原因(第五章)

1.避免重复(比如NBS中工厂的抽象) 2.限制改动的影响(封装需求变化) 3.集中控制,集中修改 4.隐含数据结构(比如具体算法的实现) 5.建立代码资源库 6.提高可读性 7.提高可移植性 8.分隔复杂操作 ...

iteye_222的博客 248

【数据集处理】中国地面气候资料日值数据集(V3.0)(含MATLAB全代码)

简介数据集数据处理

WW、forever的博客 1万+

读后感--欣赏优美的代码

 欣赏优美的代码:http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=230这个学期刚刚学过“软件工程”。但是,课堂上老师讲了很多软件开发过程的概念。其中,有程序设计和面向对象的内容没有讲解。看过这个篇文章后,再次感到大学教育的悲哀。怎么能忽略这么重要的东西呢!?其内容从软件工程的角度来理解编程中的一些误区。 重点是:子程序

Funtion IT.Equal(Attitude,Time,Energy) 873

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

如何写出高效优美的C语言代码

如何写出高效优美的C语言代码  转自:http://hi.baidu.com/cusney/blog/item/ac3259ec2b0c852063d09f72.html2009/02/16 10:02程序能跑起来并不见得你的代码就是很好的c代码了,衡量代码的好坏应该从以下几个方面来看1,代码稳定,没有隐患。2,执行效率高。3,可读性高。4,便于移植。

bbw2008的专栏 833

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

uibot在子程序执行js失败_协程概念,原理(c++和node.js实现)

什么是协程wikipedia 的定义:协程是一个无优先级的子程序调度组件,允许子程序在特定的地方挂起恢复。线程包含于进程,协程包含于线程。只要内存足够,一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配到的计算机资源。为什么需要协程简单引入就实际使用理解来讲,协程允许我们写同步代码的逻辑,却做着异步的事,避免了回调嵌套,使得代码逻辑清晰。code like thi...

weixin_39956350的博客 469

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

**探索多维度数据的优美路径:B-Spline插值库——Bspline-Fortran**

探索多维度数据的优美路径:B-Spline插值库——Bspline-Fortran 去发现同类优质开源项目:https://gitcode.com/ 在现代科学计算与数据分析领域,精准且高效地处理高维数据是每个研究者和工程师面临的挑战。今天,我们来深入探索一款旨在解决这一挑战的开源利器——Bspline-Fortran。这是一款强大的、使用现代Fortran编写的多维度B-Spline插值工具包,...

gitblog_00096的博客 524

汇编实验16 编写包含多个功能子程序的中断例程——浅谈直接地址表

汇编实验16 编写包含多个功能子程序的中断例程——浅谈直接地址表 这是王爽《汇编语言(第三版)》的第16个实验,本章的内容就是介绍了一种编程技巧——直接定址表,可以认为是一种以空间换时间的编程策略,相对于算法竞赛中的“打表法”,可以使程序变得更加简洁优美,避免过于繁琐的分支结构。 好吧,好话就说到这里。本次实验如果要照搬以前的套路,肯定是失败的!具体来说,如果要照搬书中代码(稍微做些修改)...

weixin_30312563的博客 275

3次B样条优化:Matlab程序的强力增效剂

B样条曲线是一种在计算机辅助设计和图形学中广泛使用的曲线表示方法。3次B样条曲线具有良好的光滑性和局部控制性。简单来说,它通过一系列控制点来生成一条平滑的曲线,在处理数据拟合、图形绘制等方面有着出色的表现。

qq_58982825的博客 365

如何写出高效优美的C语言代码?

程序能跑起来并不见得你的代码就是很好的c代码了,衡量代码的好坏应该从以下几个方面来看 1,代码稳定,没有隐患。 2,执行效率高。 3,可读性高。 4,便于移植。 下面发一些我在网上看到的技巧和自己的一些经验来和大家分享; 1、如果可以的话少用库函数,便于不同的mcu和编译器间的移植 2、选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱 序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根

rich369的博客 965

论如何写出高效优美的C语言代码

程序能跑起来并不见得你的代码就是很好的c代码了,衡量代码的好坏应该从以下几个方面来看  1,代码稳定,没有隐患。  2,执行效率高。  3,可读性高。  4,便于移植。  下面发一些我在网上看到的技巧和自己的一些经验来和大家分享,更多C语言开发技巧观看iOS开发培训教学视频-C语言百科全书  1、如果可以的话少用库函数,便于不同的mcu和编译器间的移植  

ccnanxi的博客 426
上一篇: 通过vpopmail实现qmail邮件账户的数据库管理
下一篇: IP MAC捆绑原理及缺陷的讨论
hem
hem
博客等级 码龄26年 19粉丝 287原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值