【Matlab】编程风格摘录

参考自《MATLAB 编程风格指南》Richard Johnson, 2002. Genial翻译.

我将对自己比较重要的规则列出,后续用之。

[TOC]

1.命名规则

1.1.变量

变量名一律小写, 单词之间用下划线连接。

循环变量

  • 整数时,以$ i、j、k 、l、m$为前缀,应该不会有循环超过5层。
1
2
3
4
5
for i_File = 1 : n_Files
for j_Position = 1 : n_Positions
...
end
end

不知道该给循环变量起什么名字的时候,用index,正好第一个字母是i。i、j在Matlab中表示虚数单位,有复数出现时避免i、j,我觉得自己应该很少入接触到复数,暂不考虑复数。

  • 双精度数时,用 x,y 和 z 。

普通变量

  • 前缀 n 应该用在作为数值对象的申明的时候 ,例如:n_files。
  • 包含多个个体的变量 ,加后缀array。例如:point, point_array。

常量

名称前加 k: kDaysInAWeek. 且除去开头的 k 之外每个单词开头字母均大写。

1
kDaysInAWeek = 7;

1.2函数

  • 函数名应该采用首字母大写的驼峰式命名法,以此和变量名区分,例如:GetName (), ComputeTotalWidth ()。
  • 函数名应该是具有意义的,使用完整的单词!

2.文件与程序结构

2.1模块化

  • 超过编辑器两屏幕的代码都应该考虑进行分割。
  • 所有的子函数和所有的函数都应该只把一件事情做好。
  • 任何在多个 m 文件中出现的代码块都应该考虑用函数的形式封装起来 。
  • 只被另外一个函数调用的函数应该作为一个子函数写在同一个文件中。 这使得代码更加利于理解与维护。

3.基本语句

循环语句

  • 循环变量应该在循环开始前立即被赋值 :
1
2
3
4
refult = zeros( n_entries,1); % 预先分配空间
for index = 1 :n_entries
result(index) = foo(index);
end
  • 在长的嵌套循环的 end 命令行添加注释 。

条件语句

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

避免使用:

1
2
3
if(value >= lower_limit)& (values <= upper_limit) & ~ismember(value, value_array)
...
end

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

1
2
3
4
5
is_valid = (value = lower_limit)& (values <= upper_limit);
isNew = ~ismember(value, value_array)
if (is_valid & isNew) % 条件看起来简单多了
...
end
  • 在 if else 结构的时候,发生较频繁的事件应该放在 if 部分,例外情况放在 else 部分。
  • 尽量在表达式中少用数字,可能会改变的数字应该用常数代替。
  • 浮点数的比较应该要小心,例如0.0025是计算机中并不按照字面值来存储的,可能是一个有很多小数位的近似值0.002499999999999之类的,用来比较可能不是我们想要的结果。

4.布局、注释与文档

长度与缩排

  • 应该将代码内容控制在前 80 列之内,在恰当的地方应该将行进行切分。
  • 基本缩排采用Matlab默认的 4 个空格

空白空格

  • 在 =,&,与 | 前后加上空格,常规的操作符两边可以加上空格:
1
2
simple_average=(first_term+second_term+third_term)/three; % 弃用
simple_average = (first_term + second_term + third_term) / three; % 采用

我觉得第上面的第二行更清楚一些。

  • 逗号后面可以加上空格,主要在函数的参数中:
1
2
foo(alpha,beta,gamma) % 弃用
foo(alpha, beta, gamma) % 采用
  • 一个块(block)内部的一个逻辑组语句应该通过一个空白行将其分隔开。例如:
1
2
3
4
5
6
7
x1 = ...
y1 = ...
x2 = ...
y2 = ...
GaussianFilter(...);
plot(...);
  • 块(blocks)之间应该用* -分隔,*开关,-结尾。
1
2
3
4
5
6
...
function1
% ********************注释**********************
function2
% ---------------------------------------------
  • 通过排列成行列整齐的方式来加强可读性
1
2
3
weithed_population = (doctor_weight * n_doctors) + ...
(layer_weight * n_lawyers) + ...
(chief_weight * n_chiefs);

Matlab的自动对齐功能ctrl+i会破坏这种结构,禁止对所有代码使用ctrl+i

注释

  • 在写代码的同时就加上注释
  • 函数头部的注释
  1. 将其分为两个块,第一个描述函数,第二个描述相关信息,比如作者、修改时间等。因为help只会输出函数头的第一个块,我们不希望输出作者等相关信息。
  2. 描述部分,函数语句、功能、输入输出、副作用 。
  3. 注释语言,看情况,如果者是中国人看则用中文,有外国人看则用英文。

例子:

1
2
3
4
5
6
7
8
9
10
11
% GaussianFilter :对一维信号的高斯滤波,头尾r/2的信号不进行滤波
% y_filted = Gaussianfilter(r, sigma, y)
% r :高斯模板大小,推荐奇数
% sigma :标准差
% y :需要进行高斯滤波的序列
% y_filted :进行高斯滤波后的序列
% author : TSC
% time : 2016-11-11
% email : 292936085#qq.com(将#替换为@)
function y_filted = Gaussianfilter(r, sigma, y)

注意:按顺序,功能、函数语句、输入参数、输出参数、注意事项;空一行,author、time、email。尽量对齐,冒号后空一格。

文档

稍微大一点的工程需要先写文档,包括:代码打算干什么(要求),它是如何工作的(设计),它依赖于什其他什么函数以及怎么被其他代码调用(接口),以及它是如何测试的等。

注:如果文档中有没有提到的,也找不到统一的规则,那么参考Google C++风格,也许适用。C++ 风格指南 - 内容目录