流程简述
在长期编写matlab代码中总结出得经验:通过一个合理的流程来写MATLAB代码,设计代码结构,能对后续的调试和修改提供极大便利。
流程可以总结如下:
1.获取数据,存为mat文件
;
2.编写整体仿真计算代码(期间,将可独立出来的计算单元写成函数);
3.存储仿真结果;
4.绘图;
5.修改图的样式、坐标、标签等;
代码结构
MATLAB都是用m文件
存储脚本代码和函数代码,下面介绍的就是一整个仿真出图所涉及的代码结构。注意,整个项目可能涉及多个m文件
实现的多个仿真出图,所以要考虑函数重用性、易用性,数据的一致性。
一般实现一次仿真的m文件
可分为如下几个部分。每一部分在代码中用%%分割成小节,以便可以单独调试每一个节。
1.第一部分:加载数据
仿真的数据不仅包括和仿真直接相关的输入参数,还包括颜色表,字体设置等与图表样式有关的数据。
%%---------------------------
- 清空:
clear
和clc
- 不会改动的数据用
mat文件
存储,使用load xxx.mat
加载; - 需要更改调试,但在整个项目需要保持一致的代码,使用单独
m文件
写成脚本并加载;
%-----------------------------
- 仅用在本文件的参数,或者对加载的数据进行改动,在此直接定义或赋值。
2.第二部分:仿真计算
%%---------------------------
- 考虑仿真可能可以分为多个独立步骤,需要提前想清楚,考虑每个步骤的输入和输出;
- 根据仿真的步骤,将不同步骤的代码块用空行或注释分开,足够清晰;
- 记录实时生成的结果数据,一般包括作图的x和y轴数据、图例文本等,用数组或元胞数组存储。;
- 将可以为其他算法使用的独立单元写成函数(也是为了代码提高可读性);
%-----------------------------
- 保存结果数据
提示
保存数据用
save
指令,这样下次打开m文件
可以直接加载上次的结果,用来绘图;用
sprintf
自动生成参数变化的图例文本。
gtxt(i)=sprintf(“I=%d A”, current(i))
函数的调用如参数过多,调用的时候保持参数名一致,或者用结构体等方法。
3.第三部分:绘图
%%----------------------------
- 加载结果数据;
%------------------------------
- 创建绘图框,获取句柄
fig1=figure
; - 打开网格
grid on
,打开保持hold on
%----------------------------
- 设置x轴标签、坐标范围/坐标刻度
%----------------------------
- 根据y轴左右侧区分,分别画:
- 用
plot
,semilogx
,semilogy
等绘图; - 设置标签、坐标范围/坐标刻度、网格
%----------------------------
- 设置图例
%----------------------------
- (可选)去除边缘的空白部分
set(fig1.CurrentAxes,'looseInset',[0 0.1 0 0]) %去白边
- 统一设置字体字号
set(fig1.CurrentAxes,'FontName',ftname,'FontSize',ftsize)
- 关闭保持
hold off
提示
用
yyaxis right/left
指定下面操作的坐标轴是左侧还是右侧;如果图中需要添加箭头、文本框,可以先用图表编辑工具直接在图上绘制,然后生成代码,生成的代码是一个函数,将其中自己需要的部分复制到自己代码后面即可。
生成图例与图中曲线对应:
gtxt(1)=sprintf( “R=%d”, resistor(1) ) ... gc(1)=plot(x{1},y{1}) ... legend([gc(1),gc(2),gc(3)],gtxt{1},gtxt{2},gtxt{3}, 'Location','Northwest')
命名规则
简单的变量用小写,其他用小驼峰命名法(如 colorListForLine);
绘图的代码文件用 Curve_xxxx.m
命名;
设置全局参数的文件用 Load_xxxx.m
命名;
计算某个值的函数文件用 Calc_xxxx.m
命名;
隐函数表达式的文件用 Fun_xxxx.m
命名 ;
原始数据的文件用 Source_xxxx.m
命名;
结果数据的文件用 Result_xxxx.m
命名;
其他数据的文件用Data_xxxx.m
命名。