日常科研常需使用MATLAB,但每次写程序前都要重新回顾基本设置。为了方便日常使用,避免在基础设置的查询和测试上浪费时间,特将本人常用的设置列在下面,并逐一说明用途。这些设置主要是为较大规模的仿真提供方便,欢迎各位在评论区补充或评论~ 后续也会根据本人经验和各位的评论,在本博客中持续更新补充~
MATLAB的仿真常用通用代码
一、程序开头
1. 清空
close all % 关掉当前打开的所有figure文件
clear, clc % 清空工作区中的所有变量,清空命令行窗口
2. 日期、时间获取
% 获取当前日期,格式为:2021.03.17
date = datestr(datetime, 'yyyy.mm.dd');
% 获取当前时间,格式为:11-14-50
time = datestr(datetime, 'HH-MM-ss');
注:上述格式也可以自行设置,只需修改引号中的格式,如
% 获取当前日期,格式为:2021/03/17 date = datestr(datetime, 'yyyy/mm/dd'); % 获取当前时间,格式为:11:14:50 time = datestr(datetime, 'HH:MM:ss');
但需要注意的是某些符号不能出现在windows系统的文件名中,如“/”,“:”等。
3. 新建文件夹
% 给出文件名(完整路径)
folderName = ['D:/simulation results/', date, ' ', time, ' hello/'];
% 新建该文件夹
[ ~, ~ ] = mkdir(folderName); % 这里使用“~”的原因是不关心相应输出变量
注1:上述文件名处也可以使用相对路径。此时,新建的文件夹位于MATLAB的当前路径下。由于运行位于不同路径的MATLAB脚本可能改变MATLAB的当前路径,进而造成新建文件夹的路径不稳定,因此个人推荐使用完整路径。
注2:((待完善) 文件夹已存在的提示)。更多具体内容请参考mkdir的官方说明。使用命令 help mkdir查看帮助或使用命令doc mkdir查看mkdir函数的脚本文件。
4. 添加/删除路径
假设在 D 盘桌面上有 Example1 和 Example2 两个文件夹,Example1 下有 1、2 两个文件夹,文件夹 1 下有 a、b 两个文件夹,文件夹 2 下有 c、d、e 三个文件夹。
folders_path = 'D:/Desktop/Example1/;D:/Desktop/Example2/;'
addpath(folders_path) % 添加当前文件夹的路径
rmpath(folders_path) % 删除当前文件夹的路径
可以添加/删除多个路径,路径之间用英文的“;”间隔开。
folder_path = 'D:/Desktop/Example1'
path_new_all = genpath(folder_path) % 得到文件夹folder_path及其所有子文件夹的路径
% path_new_all的值:'D:/Desktop/Example1/;D:\Desktop\Example1\1;D:\Desktop\Example1\1\a;D:\Desktop\Example1\1\b;D:\Desktop\Example1\2;D:\Desktop\Example1\2\c;D:\Desktop\Example1\2\d;D:\Desktop\Example1\2\e;'
% 注:genpath函数不接受多个路径,只接受单个路径
% 结合上面两部分,可以使用下面代码
addpath(genpath(folder_path)) % 添加文件夹folder_path及其所有子文件夹的路径
rmpath(genpath(folder_path)) % 移除文件夹folder_path及其所有子文件夹的路径
二、程序主体
1. 绘图的基本代码(含基本参数设置)
flag_fig = 1; % 值为1时绘图,值为0时不绘图
flag_subfig = [1, 0]; % 值为1时绘制对应子图,值为0时不绘制
flag_rePosition = 1; % 单次大量绘图时有用
% 第一次绘图仿真时设置为1,可以根据后面的参数设置自动设置figure位置和大小,此时只需手动调整各图在屏幕上的位置;
% 待手动调整好位置后,把该值设置为0,再次绘图时将直接在各个原figure上修改,而不会修改figure的大小和位置
for fig = 1: flag_fig
% 1. 便于折叠,代码查阅方便
% 2. 不会出现使用if语句时容易出现的“无法到达此语句(以及后面的后续语句)”的警告
fig_no = 0; % 方便编号,想避免覆盖已有figure时在此修改即可
LineWidth = 1.5; % 曲线宽度:默认值太细,看不清
Marker = 'oxsv^+*<>'; % 曲线记号
MarkerSize = 12; % 记号大小
CurveType = {'-', '-.', '--', ':'}; % 曲线类型:实线、点划线、虚线、细密虚线
Position = [100, 100, 350, 250]; % figure位置及大小,避免总得手动调整大小
CLR = [ 0.00 , 0.45 , 0.74 ;... 1 Blue
0.85 , 0.33 , 0.10 ;... 2 Orange-Red
0.93 , 0.68 , 0.13 ;... 3 Yellow
0.49 , 0.18 , 0.56 ;... 4 Purple
0.47 , 0.67 , 0.19 ;... 5 Green
0.64 , 0.08 , 0.18 ;... 6 Claret
0.30 , 0.75 , 0.93 ]; % 7 Azure
for fig1 = 1:flag_subfig(1) % 子图1
fig_no = fig_no + 1;
figure(fig_no)
legend_list = cell(3, 1);
x_axis = 1:5; % 统一横坐标,便于修改
plot(x_axis , y_axis_1, '-^', 'Color', CLR(1, :), 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
legend_list{1} = "legend $1$"; % 使用这种方法设置图例,可以方便增删曲线时图例的跟随修改
hold on % 为了再次绘图时能够覆盖原结果,此句需像这样放在第一条曲线的绘制之后
plot(x_axis, y_axis_2, '-o', 'Color', CLR(2, :), 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
legend_list{2} = "legend $2$";
plot(x_axis , y_axis_3, '--s', 'Color', CLR(3, :), 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
legend_list{3} = "legend $3$";
hold off
grid on % 增加网格线,便于从图上粗略读数
legend(legend_list, 'Interpreter', 'latex', 'Location', 'best')
xlabel('$X$ axis', 'Interpreter', 'latex') % 设置X轴标签(名称)
ylabel('$Y$ axis', 'Interpreter', 'latex') % 设置Y轴标签(名称)
set(gca, 'FontSize', 14) % 设置字体大小
set(gca, 'XTick', x_axis , 'XTickLabel', [2, 4, 8, 16, 32]) % 设置X轴刻度上的标签
set(gca, 'YTick', 1:2:5, 'YTickLabel', {'10^{1}', '10^{3}', '10^{5}'}) % 设置Y轴刻度上的标签
for rePos = 1:flag_rePosition, set(gcf, 'Position', Position), end % set开头的这句命令用于设置当前正在绘制的figure的大小和位置
axis([x_axis(1), x_axis(end), -Inf ,Inf]) % 设置坐标轴范围,Y轴范围可根据实际情况调节
end
for fig1 = 1:flag_subfig(2) % 子图2
fig_no = fig_no + 1;
figure(fig_no)
... % 类似子图1
end
end
三、程序结束
1. 播放音乐以提示程序结束
musicPath = 'C:/Users/AbaloneVH/练声曲.mp3'; % 音乐文件路径
% 读取音乐文件信息,y为音乐幅度序列,Fs为音乐频率
[ y, Fs ] = audioread( musicPath );
sound( y, Fs ) % 播放音乐文件
注:MATLAB播放音乐没有显式界面,除非关闭MATLAB,否则在音乐文件播放完之前不会停止。为了提前终止音乐播放,可以使用下面的命令
clear sound
2. 程序结束后自动给自己发邮件
有时仿真需要的时间太长,坐等不值当,离开太久又怕耽误仿真进度。此时,一种可以选择的方案就是让程序在结束后自动给自己发送邮件,这样即使自己离开,也可以随时了解仿真进度。
具体需要一个完整函数,且涉及诸多问题。各位请参见本人的下面这篇博客:
如何在MATLAB程序结束时自动给自己发邮件(附“身份验证失败”/“Authentication failed”的解决方案)