matlab.fat,MATLAB的编程规范总结-程序员宅基地

技术标签: matlab.fat  

好的编程习惯,可以提高编程效率,不仅可以使代码容易修改,也容易给别人看懂,便于交流。我们不仅要写出“给机器读懂的代码”,也写出“给人看得懂的代码”。

本文根据一些目前搜索到的文献和自己的一些使用心得,整理出这个文档,大家可以根据经验提出自己的心得,相互促进,共同提高。

1,命名规则

(1)变量

a,使用英文。变量名最重要的原则就是,一看就知道这个变量是什么意思。由于程序大部分是字母,所以最好还是有英文字母表示意思比较靠谱。如果英文稍微差点,一下子不知道变量的英文怎么写,可以查字典,现在在线词典很多,这样还可以使自己的英文水平提高,二则可以提高程序可读性。比如,我们要表达“风速”,“windSpeed”比“fengsu”要好,时间久了,你再看“fengsu”的的时候,还必须得拼一下,搞不好就弄成“风俗”。

b,变量名应该以小写字母开头的大小写混合形式。

例如,maturityDay,anthesisDay。

注意:有些人喜欢用“下划线”把词语隔开,maturity_day,athesis_day,这样也一目了然,但是在MATLAB中,不推荐这么用,因为下划线会在Tex解释程序中为下标的转换符,比如:xlabel(“maturity_day”),在图中会显示成“maturityday”。

c,用大范围意义的变量名应该带有意义的名称,但下范围的变量名可以用短变量名。

例如:stepSize:大范围意义

dt(δt):小范围

d,前缀n用在作为数值对象申明

例如:nRows

e,遵循的一个有关复数变量的惯例

所有变量名要么为单数形式,要么为复数形式。两个变量只是最后相差一个字母s加以区别的情况应该避免,apple和apples区别2个变量,看着头大。可以用一个代表复数的标示,如:appleArray

f,代表单个实体数据的变量可以加以后缀No或者是前缀i

例如,tableNo,employeeNo,

g,循环变量应该以i,j,k为前缀

例如,iFiles,jPositions。不使用i,j,的原因是:因为这两个在matlab里面是虚数。

h, 嵌套循环,循环变量要以字母顺序

for iFile = 1:nFiles

for jPosition = 1:nPositions

end

end

i, 避免否定式的布尔变量命名。

例如:命名isNotFound,在使用判断的时候,~isNotFound,搞半天才知道啥意思。所以不适用否定式布尔变量命名。

j, 缩写形式,即使是通常的大写缩写,也应该于小写字母混合使用。

采用:html,isUsaSpecific,checkTiffFromat()

避免使用:hTML,isUSASpecific,checkTIFFFormat()

(2)常数

a,命名常数(包括全局变量)应该采用大写字母,用下划线分割单词。

例如:MAX_ITERATIONS,COLOR_RED

b, 参数可以以某些通用类型名作为前缀

COLOR_RED,COLOR_GREEN,COLOR_BLUE

(3) 结构体

a, 结构体的命名应该以一个大写字母开头

这是区别一般变量,例如:ParameterSet

b, 结构体的命名应该是隐性的,并且不需要包括字段名

用Segment.length.

避免Segment.segmentLength

(4) 函数

a, 函数名应该采用小写字母,且将函数名与它的m 文件名保存为相同

b, 函数名应该有具体的意义

避免短的函数名,这经常使得其名字含糊不清。

例如:

采用: computetotalwidth()避免: compwid()

c, 单输出变量的函数可以根据输出参数命名

例如,mean,std

d, 没有输出变量或者返回值为句柄的函数应该根据其实现的功能命名

例如:plot

e, 前缀get/set 应该作为访问对象或者属性的保留前缀

例如:getobj(.)

f, 前缀 compute应该用在计算某些量的函数的地方

例如:ComputWeightedAverage()

g, 前缀find可以用在那些具有查询功能的函数的地方

例如:FindOldestRecord(.);FindHeaviestElement(.);

h, 前缀initialize可以用在对象或者是概念(concept)建立的地方

例如:InitializeProblemState(.);

i, 前缀is应该用在布尔函数的命名的地方

例如:IsOverPriced(.)

j, 避免无意识地覆盖

有时候我们取的名字,可能在MATLAB中含有这个函数名了,可以用exist检查是否含有了。

k, 避免缩写

采用:ComputeArrivalTime(.)避免:CompArr(.).

l, 考虑使得名字可以拼读

2,文件与程序结构

(1) M文件

a, 模块化

编写一个大程序的最好的方法是将它以好的设计分化为小块(通常采用函数的方式)。

这种方式通过减少为了理解代码的作用而必须阅读的代码数量使得程序的可读性、易于理解性和可测试性得到了增强。超过编辑器两屏幕的代码都应该考虑进行分割。并且设计规划很好的函数也使得它在其他的应用中可用性增强了。

b, 确保交互过程清晰

函数通过输入输出参数以及全局变量与其他代码交互通信。使用参数几乎总是比使用

全局变量清楚明了。采用结构可以避免那种一长串儿的输入输出参数的形式。

c,分割

所有的子函数和所有的函数都应该只把一件事情做好。每个函数应该隐藏(hide)一些东西。

d,利用现有的函数

开发一个有正确功能的、可读的、合理灵活性的函数在一项有重大意义的任务。或许寻找一个现成的提供了要求的部分、甚至全部功能的函数应该更快也更具有正确性。

e,任何在多个m文件中出现的代码块都应该考虑用函数的形式封装起来

f,子函数

只被另外一个函数调用的函数应该作为一个子函数写在同一个文件中。这使得代码更加利于理解与维护。

g,测试脚本

为每一个函数写一个测试脚本。这样可以提高初期版本的质量和改进版本的可靠性。

(2)输入与输出

a, 编写输入/输出模块

输出要求可以无需特别注意就可以根据变化而改变,输入的格式与内容根据变化的时候经常很混乱。找到处理输出的地方进行改善,提高其可维护性。避免将输入/输出部分的代码与计算功能的代码混淆在一起,单个函数的预处理的时候除外。各种功能混合的函数的可再用性一遍很小。

b,格式化输出使得其易于利用

如果输出很大可能是人工阅读,那么就让输出采用易于越多的描述性的方式。

如果输出更多的可能是通过其他软件调用而不是人,那么应该使得输出易于解析。

如果这以上两种情况都很重要,将输出表达成易于解析的格式,并编写一个格式化输出的函数用来产生一个人工可读的输出版本。

3,基本语句

(1) 变量与常数

a,变量不应该重复使用

通过确保所有的概念都只有唯一的意义可以加强代码的可读性,以及通过消除误解的定义可以减少错误的可能。

b,同种类型的相近的变量可以在同一个语句中定义

c,不相近的变量应该不要在同一个语句中定义

d,注意在文件开始部分的注释中为重要变量编写文档

MATLAB不需要变量申明,这种信息就可以在注释中提供。

示例:%pointArray Points are in rows with coordinates in columns.

e,注意在语句行注释的最后为常数编写文档

示例: THRESHOLD = 10;%Maximumnoise level found by experiment。

(2) 全局变量

a,应该尽量少地使用全局变量

(3)循环语句

a,循环变量应该在循环开始前立即被赋值。

这可以提高循环的速度,有助于防止循环没有执行所有的可能索引而产生的虚假值。

示例:

refult= zeros( nEntries,1);

forindex = 1:nEntries

result(index)= foo(index);

end

b,在循环中应该尽量少用break与 continue

这些结构可以与goto 相比较,只有当他们可以证明用这些结构可以比他们相应的结构化部分有更好的可读性的时候,才可以使用。

c,在嵌套式循环的时候应该在end行加上注释

在长的嵌套循环的end命令行添加注释可以有助于弄明白哪些语句在那个循环体内、在此处之前已经完成了哪些功能。

(4)条件语句

a, 应该避免复杂的条件表示式,而采用临时逻辑变量进行替代

通过对表达式指定逻辑变量,使得程序更能够自为文档,使得程序结构更易于阅读

与调试。

示例:

避免使用:

if(value>=lowerLimit)& (values<=upperLimit)&~ismember(value,valueArray)

……

……

end

而应该用如下的方式代替:

isValid = (value=lowerLimit)& (values<=upperLimit);

isNew =~ismember(value,valueArray)

if ( isValid &isNew)

……

……

end

b,在if else 结构的时候,发生较频繁的事件应该放在if 部分,例外情况放在else部分

这样通过将例外情况排除在常规执行路径之外可以提高程序的可读性。

示例:

fid = fopen(fileName);

if(fid~ = -1)

else

end

c,条件表达式if 0 是应该避免的,除非在对临时程序块进行注释的时候

如果确信表达式在程序正常执行的时候不会发生,首选的方法是采用编辑器的块注释。

d,一个 switch语句应该包含otherwise条件

将otherwise情况遗漏在外是一种通常错误,这或许会导致不可预测结果。

正确示例:

switch(condition)

case ABC

处理语句;

case DEF

处理语句;

otherwise

处理语句;

end

e,switch 变量应该通常是字符串

字符串在这种情况下能够很有效,通常他们比采用列举值的形式意义更丰富。

(5)其它

a,采用附加说明

MATLAB对于操作运算有个优先级的文档,但是谁愿意记住它们的具体内容呢?如果在某些地方有任何疑问,采用附加说明使得表达清楚。特别是在扩展的逻辑表达式的时

候尤其有用。

b,尽量在表达式中少用数字。

可能会改变的数字应该用常数代替如果一个数字它的本身没有明确的意义,采用将它命名为常数可以加强程序的可读性。并且,改变参数的定义比改变文件中所有的相应出现地方的数字要容易得多。

c,浮点常数应该在小数点前面写上一个阿拉伯数据

这是坚持数学习惯的语法要求,而且,0.5 比.5 更具有可读性,因为.5 很有可能被误认为是整数5。

d,浮点数的比较应该要小心

二进制表达可能导致麻烦,如下面的例子所示:

shortSide = 3;

longSide = 5;

otherSide = 4;

longSide^2 ==(shortSide^2+otherSide^2)

ans =

1

scaleFactor = 0.01;

(scaleFactor*longSide)^2 = =((scaleFactor*shortSide)^2+(scaleFactor*otherSide)^2

ans =

0

e,clc;clear;close all

在一般的M文件开头,写这三个东西,可以初始化MATLAB,把打开的表,工作空间清理。

4,排版、注释与文档

(1) 排版

a,应该将代码内容控制在前80列之内

对于一个编辑器、终端仿真器、打印机、调试器以及文件的通常列数是80列,因此通常几个人的程序共享的时候,大家通常将内容控制在前80列之内。在程序员之间传递文件的时候,避免无意识的分行可以增强程序代码的可读性。

MATLAB的M文件编排,有这个线提示。

b,在恰当的地方应该将行进行切分

当语句长度超过80 列的限制的时候应该切分行。通常:

在一个逗号或者空格之后进行断开;

在一个操作符之后断开;

在表达式开始前的地方重新开始新的一行;

示例:

totalSum = a +b +c +…

d+e;

function (param1,param2,…

param3)

setText(['Long line split'…

'into two parts.']);

c,基本缩排应该是3或者4个空格

好的缩排或许是唯一的一个展现程序结构的好方法。

1个空格是缩排太小而不能够强调出代码的逻辑分层;2个空格的缩排在为了减少因为嵌套循环超过80列而切分行的断裂的时候被建议采用,而MATLAB通常没有太多太深的循环嵌套。大于4个空格的缩排使得因为行切分的机会增大而使得代码的可读性变差。4个空格的缩排是MATLAB编辑器的缺省设置,在以前的一些版本,缺省缩排是3个空格。

d,应该与MATLAB编辑器的缩排一致

MATLAB编辑器提供了使得代码结构清晰的缩排,并且与C++与Java推荐使用的缩排方式相一致。

e,通常情况下,一行代码应该只包含一个可执行语句

f,短的单个if,for 或者while语句可以写在一行。

if(condition),statement;end

while(condition),statement;end

for iTest = 1:nTest,statement;end

g,空白空格

在 =,&,与| 前后加上空格

在指定的字符前后加上空格可以增强其可视化的分割提示,明显地将语句左右两部分分开。在二值逻辑操作符前后加上空格可以使得复杂的表达式清晰。

示例:

simpleSum = firstTerm+secondTerm;

h,常规的操作符两边可以加上空格

这种方式是有争议的。部分人认为它可以增强其可读性。

示例:

simpleAverage= (firstTerm + secondTerm) / two;

1 : nIterations

i,逗号后面可以加上空格

这些空格可以增强可读性。有些程序员为了避免切分行而不采用这种方式。

示例: foo(alpha, beta, gamma),也可以foo(alpha,beta,gama)

j,分号或者同一行多条指令的逗号之后应该加上一个空格字符

空格加强可读性。

示例:if (pi>1),disp( 'Yes' ), end

k,关键字后面应该加上空格

这种方式有助于区分关键字与函数。

l,一个块(block)内部的一个逻辑组语句应该通过一个空白行将其分隔开

在块的逻辑单元之间加入空白行可以增强代码的可读性。

m,块(blocks)之间应该用多行空白行分隔

一种方式是采用3 隔空白行。采用大的间隔来与块内分隔相区别,使得在文件中,

块看起来非常明显。另外一种方式是采用注释符号后面跟多个诸如*或者-。

n,通过排列成行列整齐的方式来加强可读性

代码排列成行列整齐的形式可以使得切分表达式容易阅读与理解。这种排版也有助于

揭示错误。

示例: weithedPopulation = (doctorWeight *nDoctors) + …

(layerWeight* nLawyers) + …

(chiefWeight* nChiefs);

(2) 注释

注释的目的是为代码增加信息。注释的典型应用是解释用法、提供参考信息、证明结果、阐述需要的改进等。经验表明,在写代码的同时就加上注释比后来再补充注释要好。

a, 注释不能够改变写得很糟糕的代码效果

注释不能够弥补因为代码命名不当、没有清晰的逻辑结构等造成的缺陷。存在这样缺陷的代码应该重写。

b, 注释文字应该简洁易读

一个糟糕的或者是无用的注释反而会影响读者的正常理解。N.Schryer提到:“如果代码与注释不一致,那么或许两者都是错误的。”一个通常更重要的是注释应该讲的是“为什么”(Why)和“怎么做”(how),而不是“是什么”(what)。

c, 函数的注释写法(尽量使用英文)

如下例子:

%================================================================

% 功能: 求圆孔的夫琅禾费衍射光强分布

% 参数: CircleHoleFD为圆孔结构体,包含圆孔衍射相关信息;

% theta为衍射场的次波方向,可以为向量,求取各方向的光强

% 返回值: I为衍射光强分布

% 主要思路:使用夫琅禾费单缝衍射公式计算

% 备注: 入射角只考虑一个维度的

% 调用方法:见CalcCircleHoleFD_Test文件

% 日期: 2011/7/12 20:37

%================================================================

function I =CalcCircleHoleFD(CircleHoleFD, theta)

。。。(具体编程开始)

(3) 文档

a,文档规范化

作为有用的文档应该包含一个对如下内容的可读性的描述:代码打算干什么(要求),

它是如何工作的(设计),它依赖于什其他什么函数以及怎么被其他代码调用(接口),以

及它是如何测试的等。对于额外的考虑,文档可以包含解决方案的选择性的讨论以及扩展

与维护的建议。

b,首先考虑书写文档

一些程序员相信的方法是:“代码第一,回答问题是以后的事情。”而通过经验,我们

绝大多数人知道先开发设计然后再实现可以导致更加满意的结果。如果将测试与文档留在最后,那么开发项目几乎不能够按期完成的。首先书写文档可

以确保其按时完成甚至可能减少开发时间。

c,修改

一个专业的对代码修改进行管理和写文档的方法是采用源程序控制工具。对于很简单

的工程,在函数文件的注释中加入修改历史比什么都不做要好。

微信扫一扫,关注生物学霸

微信号:ShengWuXueB

参考文献:

Anonymous,Good Matlab Programming Practices for the Non-Programmer

Richard Johnson,MATLAB Programming Style Guidelines

Fayssal El Moufatich,MATLAB Programming Tips & Tricks:Part I Functional Programming

Genial 译,MATLAB 编程风格指南

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39948111/article/details/116068545

智能推荐

QEMU如何虚拟PCI设备_qemu创建pci设备-程序员宅基地

文章浏览阅读8.2k次,点赞5次,收藏43次。引子PCI(PCIE)设备在PC架构中有着举足轻重的地位,了解PCI总线与PCI设备在QEMU中的工作机制有助于我们了解CPU和设备之间的沟通机制,会对PC系统有更全面的认知,同时对virtio设备的理解也会更有帮助。回顾PCI 设备与总线上图是比较经典的PC架构图,从上图中可以看到CPU之间通过interchip bus连接,然后和I440FX芯片连接,I440FX就是我们熟知的北桥芯片..._qemu创建pci设备

TCP/IP协议栈初始化(一) 长江之源_tcp/ip协议栈的初始化-程序员宅基地

文章浏览阅读879次。从开始的开始说起TCP/IP协议栈的工作离不开数据结构的支撑。如果说TCP/IP协议栈构成了这庞大的网络世界,那么底层的数据结构就是这个世界的基石。那么这些基石都是如何从一个字节一个字节组织起来的呢?要从它们被创造的时候开始说起。一想到这么牛的协议居然是从一个全0的内存里构建起来的,想去源头看看的冲动,就像是站到了长江的源头,俯瞰整个长江流域的感觉。一切开始的开始,自然就是系统启动的时刻了。走_tcp/ip协议栈的初始化

List去重及使用jdk8语法操作list去重_jdk8 list去重-程序员宅基地

文章浏览阅读4.6k次。1. 集合List去重List是有序的,可以重复的。Set是无序的,不可以重复的。List去重,如果T是基本类型的,只需要将List转成Set就可以去重;如果T是对象类型,那么需要重新equals()和hashCode()方法。1.1 基本类型假如有一个List集合[Simon, kevin, lucy, kevin, lily],去掉其中重复的元素kevin。List<String..._jdk8 list去重

STL中bind1st和bind2nd之解析-程序员宅基地

文章浏览阅读2.9k次,点赞5次,收藏5次。今天看到>一书课后习题14.42,问题如下:使用标准库函数对象及适配器定义一条表达式,令其:统计大于1024的值有多少个。解题利用标准库函数对象类greater 答案为:count_if(vec.begin(),vec.end(),bind2nd(greater(),1024));这样就牵扯出了bind1st 和 bind2nd 这两个捆绑函数。这两个适配器函数和标准库函数对象类都是定_bind1st

使用 keepalived 设置虚拟 IP 环境,实现IP漂移_keepalived 虚拟ip可以漂移,端口不通vrrp_strict也没配置-程序员宅基地

文章浏览阅读1.4w次。使用 keepalived 设置虚拟 IP 环境准备准备三个机器,IP地址信息如下:host1: 192.168.2.206host2: 192.168.2.205hots3: 192.168.2.177安装 keepalived在两台机器上分别安装 keepalived$ sudo yum install -y keepalived1配置 keepaliv..._keepalived 虚拟ip可以漂移,端口不通vrrp_strict也没配置

linux系统查看当前正在运行的服务-程序员宅基地

文章浏览阅读2.7k次。--查看当前服务器所有服务service--status-all-- 查看当前所有正在运行的服务service--status-all|greprunning--查看指定服务运行状态如 httpdservice--status-all|grephttpd或 service httpd status--查看系统启动自启动的服务列表chk..._ubantu系统查看正在运行的服务

随便推点

VLAN与三层交换机_有vlan的就是三层交换机-程序员宅基地

文章浏览阅读4.3k次,点赞11次,收藏46次。VLAN与三层交换机实验案例:在华为ensp软件上手动配置三层交换机,实现不同VLAN间数据交互,并通过数据抓包验证。实验环境如图所示,在华为ensp软件上将3个交换机4台PC按图进行连接,配置ip和虚拟网关,保证所有PC信息互通,并对中继线处抓包验证。需求描述将上述过程通过实验再现出来。在华为ensp虚拟环境进行试验,推荐步骤新建一个拓扑图如下所示,手动配置各个路由器端口的ip地址配置其环回地址设置下一跳地址 使其顺时针正常通信在各个路由器上ping其余两个能够正_有vlan的就是三层交换机

各种网站收集_无作为官网-程序员宅基地

文章浏览阅读3.5k次。go中文下载地址 各个版本:https://studygolang.com/dltinypng在线压缩png一般可以压缩50%: https://tinypng.com/在线解析生成二维码:https://cli.im/deqr免费外链图片空间:http://www.tietuku.com/upload石墨文档:https://shimo.im/welcome抖音排行榜:htt..._无作为官网

java自定义json解析器,SpringBoot使用自定义json解析器的使用方法-程序员宅基地

文章浏览阅读384次。Spring-Boot是基于Spring框架的,它并不是对Spring框架的功能增强,而是对Spring的一种快速构建的方式。Spring-boot应用程序提供了默认的json转换器,为Jackson。示例:pom.xml中dependency配置:xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.o..._fastjson 自定义jsonreader并指定使用

【java】 java 解压tar.gz读取内容-程序员宅基地

文章浏览阅读1k次。package com.xwolf.stat.util;import com.alibaba.druid.util.StringUtils;import com.alibaba.fastjson.JSON;import com.google.common.collect.Lists;import com.google.common.collect.Maps;i..._tararchiveentry读取

最大似然估计、梯度下降、EM算法、坐标上升_最大似然估计中的梯度下降法-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏13次。主要讲解的是机器学习中参数学习算法之间的区别,以及应用的场景。最大似然估计:其中目标函数是对数似然函数。为了求目标函数取最大值时的theta。有两个关机键步骤,第一个是对目标函数进行求导,第二个是另导数等于0,求解后直接得到最优theta。两个步骤缺一不可。梯度下降:对目标函数进行求导,利用导函数提供的梯度信息,使参数往梯度下降最快的方向移动一小步,来更新参数。为什_最大似然估计中的梯度下降法

OpenGL学习(八) 纹理初步_glbatch.h m3dvector3f在哪里声明-程序员宅基地

文章浏览阅读1.6k次。// Pyramid.cpp// OpenGL SuperBible, Chapter 5// Demonstrates Texture mapping a pyramid// Program by Richard S. Wright Jr.#include // OpenGL toolkit#include #include #include #include #inclu_glbatch.h m3dvector3f在哪里声明

推荐文章

热门文章

相关标签