前言

本文记录matlab代码相关的笔记,以后续学习参考(有些也许不是很高效,但是是我个人使用习惯)

(本文若有不正确的地方望大佬们多多指正Orz)

【本文优先发布于我的个人博客网站www.226yzy.com ,转载请注明出处

1.绘图相关

1.基本绘图

首先绘图需要点的横纵坐标的数据,这里使用下面的数据

1
2
x=[1507.2,1484.0,1459.8,1435.6,1410.9,1391.2,1368.5,1350.0,1331.0];
y=[5170.8,5175.4,5176.1,5176.6,5175.1,5191.9,5197.9,5220.3,5240.6];

然后绘图的话我一般会通过下面这个函数绘制

1
plot(x,y,'-');

上面的三个参照,x和y就是点的横纵坐标的数据,对于第三个参数,为方便解释,由下表呈现

MATLAB 绘图命令的各种选项
曲线线型 曲线颜色 曲线颜色 标记符号 标记符号
选项 意义 选项 意义 选项 意义 选项 意义 选项 意义
‘-’ 实线 ‘b’ 蓝色 ‘c’ 蓝**绿色** ‘*’ 星号 ‘pentagram’
‘- -’ 虚线 ‘g’ 绿色 ‘k’ 黑色 ‘**.’** 点号 ‘o’
‘:’ 点线 ‘m’ 红紫色 ‘r’ 红色 ‘x’ 叉号 ‘square’
‘-.’ 点划线 ‘w’ 白色 ‘y’ 黄色 ‘v’ ‘diamond’
‘none’ 无线 **用一个1x3向量任意指定[r,g,b]红绿蓝三原色 ‘^’ ‘hexagram’ 六角星
‘>’ 左三角 ‘<’ 右三角

2. 使用plot3()函数绘制三维图像

绘制三维图像需要x、y、z、轴上的坐标数据,这里使用下面的数据

1
2
3
x=[1507.2,1484.0,1459.8,1435.6,1410.9,1391.2,1368.5,1350.0,1331.0];
y=[5170.8,5175.4,5176.1,5176.6,5175.1,5191.9,5197.9,5220.3,5240.6];
z=[5,6,8,9,3,9,6,4,5];

然后函数调用如下即可

1
plot3(x,y,z,'-')

各参数具体含义与plot()函数基本相同

3. 为图添加标题、坐标轴名称、格栅

为了绘制的图的完整就需要添加标题、坐标轴名称等信息

标题、坐标轴名称的添加如下

1
2
3
4
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
title('标题');

格栅的添加需输入命令

1
grid on

关闭格栅则输入命令

1
grid off

4.同一图内多条曲线绘制,及双y轴图像、多幅图的绘制

1.同一图内多条曲线绘制

假设数据如下

1
2
3
x=[1507.2,1484.0,1459.8,1435.6,1410.9,1391.2,1368.5,1350.0,1331.0];
y=[5170.8,5175.4,5176.1,5176.6,5175.1,5191.9,5197.9,5220.3,5240.6];
z=[5,6,8,9,3,9,6,4,5];

如果绘制两条则如下

1
2
3
plot(x,y,'-');
hold on;
plot(x,z,'-');

即插入hold on;

2.双y轴图像

双y轴图像的绘制如下

1
plotyy(x,y,x,z)

前面一对为左y轴,后面一对为右y轴

3.多幅图的绘制

假设我们需要绘制6幅图,并以3行2列的形式呈现即下图的样子

matlab多图示例

实现上图的代码大致如下(数据的就没放进去了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
subplot(3,2,1);
plot(t2,A1,'b-');
hold on;
plot(t2,k1,'r-');
ylabel('监测量');
xlabel('时间');
title('PM2.5');
subplot(3,2,2);
plot(t2,A2,'b-');
hold on;
plot(t2,k2,'r-');
ylabel('监测量');
xlabel('时间');
title('PM10');
subplot(3,2,3);
plot(t2,A3,'b-');
hold on;
plot(t2,k3,'r-');
ylabel('监测量');
xlabel('时间');
title('CO');
subplot(3,2,4);
plot(t2,A4,'b-');
hold on;
plot(t2,k4,'r-');
ylabel('监测量');
xlabel('时间');
title('NO2');
subplot(3,2,5);
plot(t2,A5,'b-');
hold on;
plot(t2,k5,'r-');
ylabel('监测量');
xlabel('时间');
title('SO2');
subplot(3,2,6);
plot(t2,A6,'b-');
hold on;
plot(t2,k6,'r-');
ylabel('监测量');
xlabel('时间');
title('O3');

这主要是用了subplot()函数;

该函数有三个参数,

第一个代表最终绘制有几行,

第二个代表最终绘制有几列,

第三代表该图为第几幅图

5. 调整坐标比例避免图像变形

这个方法在我的另一篇文章有提到过(MATLAB拟合圆 | 星空下的YZY (226yzy.com)

输入下面的命令

1
axis equal

该命令就是保证横纵坐标轴的最小刻度一致

得到的图像如下

matlab拟合圆axis equal图像调整

或者用另一个命令

1
axis square

该命令使横纵坐标比例为1

得到的图像如下

matlab拟合圆axis square图像调整

若想恢复默认,只需输入下面的命令即可

1
axis auto

这样你就可以得到一个正常的圆的图像了

6. MATLAB提供的特殊二维曲线绘制函数

其它的一些MATLAB提供的特殊二维曲线绘制函数如下表

MATLAB提供的特殊二维曲线绘制函数
函数名 意义 常用调用格式
bar() 二维条形图 bar(x,y)
comet() 彗星状轨迹图 comet(x,y)
compass() 罗盘图 compass(x,y)
errorbar() 误差限图形 errorbar(x,y,l,u)
feather() 羽毛状图 feather(x,y)
fill() 二维填充函数 fill(x,y,c)
hist() 直方图 hist(y,n)
loglog() 对数图 loglog(x,y)
polar() 极坐标图 polar(x,y)
quiver() 磁力线图 quiver(x,y)
stairs() 阶梯图形 stairs(x,y)
stem() 火柴杆图 stem(x,y)
semilogx() semilogy() 半对数图 semilogx(x,y) semilogy(x,y)

7. matlab绘制散点图矩阵

matlab绘制散点图矩阵可通过plotmatrix()函数

可通过下面的代码得到一个简单的效果图

1
2
X = randn(50,3);  %创建一个由随机数组成的 50×3 数组。
plotmatrix(X)

matlab散点图矩阵示图

比较完整的调用如下

1
2
3
X = randn(50,3);
plotmatrix(X)
[S,AX,BigAx,H,HAx] = plotmatrix(X)

根据官方文档的说明散点图矩阵 - MATLAB plotmatrix - MathWorks 中国,上面参数的含义如下

  • S - 散点图的图形线条对象
  • AX - 每个子坐标区的坐标区对象
  • BigAx - 容纳子坐标区的主坐标区的坐标区对象
  • H - 直方图的直方图对象
  • HAx - 不可见的直方图坐标区的坐标区对象

2. matlab对Excel数据的读写

1.对Excel数据的读入

对Excel数据的读入我个人还是比较习惯用xlsread()函数的,其调用如下

1
t2=xlsread('C:\Users\Dell\Desktop\新建 XLSX 工作表.xlsx',3,'M2:M4141');

该函数包含了三个参数

第一个参数是文件的路径

第二个参数是第几个工作表,这个参数你也可以写该工作表的名称,如果该工作表名为Sheet3可如下调用

1
 t2=xlsread('C:\Users\Dell\Desktop\新建 XLSX 工作表.xlsx','Sheet3','M2:M4141');

第三个参数是调取的数据在Excel表中的具体位置范围

2. 对Excel数据的写入

对Excel数据的写入我个人还是比较习惯用xlswrite()函数,其调用如下

1
xlswrite('C:\Users\Dell\Desktop\2019D\新建 XLSX 工作表.xlsx',kk,2,'A1');

该函数包含了四个参数

第一个参数是文件的路径

第二个参数是要写入的数据集的名称

第三个参数是第几个工作表,这个参数你也可以写该工作表的名称,

第四个参数是在表格中写入的位置,如果默认从A1的位置开始,则可以不写

3.拟合及求解相关内容

1.多项式拟合

首先我找到了之前我自己比较早的时候写的一份代码,该代码进行的是一元一次回归方程的拟合结果的绘图,并预测1997和1998年的值(x0和y0中有这两年的数据是因为前面运行得出了(即第一处注释的位置),后续添加上去的)

1
2
3
4
5
6
7
8
9
10
11
12
13
x0=[1990 1991 1992 1993 1994 1995 1996 1997 1998];
y0=[70 122 144 152 174 196 202 233.4286 253.9286];
plot(x0,y0,'*')
a=polyfit(x0,y0,1)
poly2sym(a)
%y97=polyval(a,1997)
%y98=polyval(a,1998)
xi=1990:0.1:1998;
yi=interp1(x0,y0,xi);
yyi=(721279745102309*xi)/35184372088832 - 5594463330784247/137438953472
hold on
%yyi=interp1(x0,y0,xi,'spline');
plot(xi,yyi,'b-')

1. polyfit()函数

polyfit()函数是用于多项式曲线拟合的

该函数有3个参数

前两个即横纵坐标的数据

第三个代表的是几次多项式

2. poly2sym()函数

poly2sym()函数它是把系数组转换成自符号多项式

3. polyval()函数

polyval()函数用于多项式计算

4. interp1()函数

interp1()函数用于一维数据插值

该函数有4个参数分别为样本点、样本值、查询点和插值方法

插值方法具体见该链接一维数据插值(表查找) - MATLAB interp1 - MathWorks 中国

2.方程交点求解

对于方程间交点求解代码如下

1
2
3
4
syms x y
s=solve(y==-sqrt(0.4592.^2-(x-51.2165).^2)+4.2939,y==-2.7415*x+134.6935);
xx=double(s.x)
yy=double(s.y)

solve()函数中方程可替换

xx和yy分别代表交点的横纵坐标

3.修正倾斜角度

修正倾斜角度代码如下,下面代码在24.5为倾斜角度

1
2
3
AA=A1*cos(pi/24.5)-A2*sin(pi/24.5);
AB=A1*sin(pi/24.5)+A2*cos(pi/24.5);
plot(AA,AB,'-');

4. 圆的拟合

这个我在另一篇有专门写,这里就不再赘述了

传送门:MATLAB拟合圆 | 星空下的YZY (226yzy.com)

5.多元回归方程拟合

当时有参考这一篇(4条消息) [matlab]多元线性回归regress_YinJianxiang的博客-CSDN博客_matlab多元线性回归

对于该问题代码如下

1
2
X1 = [ones(size(A1)) B1 C1 C2 C3 C4 C5];
[b1,bint1,r1,rint1,stats1] = regress(A1,X1);

X1中的各个参数为矩阵,具体参数个数看所求因素的个数

例如B1、C1这些代表了多元回归方程的各项除系数外的内容

1. size()函数

size()函数可获取该矩阵的行数和列数

2. ones()函数

ones()函数表示生成全1的矩阵,ones(size(A1))产生的矩阵是与A1大小相同的全1矩阵

3. regress()函数

regress()函数是多元线性回归的求解函数

A1代表预期结果的数据,X1则如上,代表各因素的数据

根据多元线性回归 - MATLAB regress - MathWorks 中国的描述

b1,bint1,r1,rint1,stats1这些的含义如下

b1为多元线性回归的系数估计值

bint1为系数估计值的置信边界下限和置信边界上限,即置信区间

r1为残差

rint1用于诊断离群值的区间

stats1为模型统计量以数值向量形式返回,包括 R² 统计量、F 统计量及其 P 值,以及误差方差的估计值

我们得到了这些数据后,就可以通过得到的多元回归方程计算该方程的数据,并得知拟合情况

1
k1=b1(1)+b1(2)*B1+b1(3)*C1+b1(4)*C2+b1(5)*C3+b1(6)*C4+b1(7)*C5;

4. rcoplot()函数

在使用过上述的regress()函数后,可以通过下面的代码绘制残差图

1
rcoplot(r1,rint1)

rcoplot()函数有两个参数

第一个为残差

第二个为诊断离群值的区间

4.MTALAB图论工具箱

在之前我的一篇文章中,我通过代码实现Floyd和Dijkstra算法最短路径—Floyd与Dijkstra算法 | 星空下的YZY (226yzy.com)matlab中提供了相关的工具箱,我们可以通过命令调取使用,还可以绘制图像更加直观地看到结果。

1. Matlab图论工具箱的命令

根据《数学建模算法与应用(第2版)》第54页中整理的Matlab图论工具箱的命令

命令名 功能
graphallshortestpaths 求图中所有顶点对之间的最短距离
graphconncomp 找无向图的连通分支,或有向图的强弱连通分支
graphisdag 测试有向图是否含有圈,不含圈返回1,否则返回0
graphisomorphism 确定两个图是否同构,同构返回1,否则返回0
graphisspantree 确定一个图是否是生成树,是返回1,否则返回0
graphmaxflow 计算有向图的最大流
graphminspantree 在图中找最小生成树
graphpred2path 把前驱顶点序列变成路径的顶点序列
graphshortestpath 求图中指定的一对顶点间的最短距离和最短路径
graphtopootder 执行有向无圈图的拓扑排序
graphtraverse 求从一顶点出发,所能遍历图中的顶点

2.绘制有向图

通过matlab可以直观地画出相应的路径图

1
2
3
4
5
6
t=[41 99 51 32 15 45 38 32 36 29 21];%路径耗时
s=[6 1 2 2 3 4 4 5 5 6 1];%起点
e=[2 6 3 5 4 1 6 3 4 3 5];%与起点对应的目的地
dg=sparse(s,e,t)%构造的稀疏矩阵表示图
h=view(biograph(dg,[],'ShowWeights','on'))%显示图的结构
dist=graphallshortestpaths(dg)%显示图中每对结点之间的最短路径 

view()设置相机视线具体见官方文档解释相机视线 - MATLAB view - MathWorks 中国

sparse()函数是用于构建稀疏矩阵

ShowWeights=off表示无权图,on表示赋权图

另外ShowArrows=off表示无向图,on表示有向图

graphallshortestpaths()可以得出各点间的最短路径

5.其他

1.最短路径

这个我在另一篇也有专门写,这里就不再赘述了

无论以什么方式引用,请注明出处吼😉

这篇许多代码都是我自己写的创作不易😂

传送门:最短路径—Floyd与Dijkstra算法 | 星空下的YZY (226yzy.com)

2. matlab官方中文在线文档

有些描述准确一点还是参考官方文档比较好

MATLAB Documentation - MathWorks 中国