合集如下:
MATLAB入门到精通(一):简介及数据类型
MATLAB入门到精通(二):基本语句及绘图
MATLAB入门到精通(三):常用函数及数学应用
六、编程语句
6.1 选择结构
6.1.1 if 结构
if结构的基本结构如下:
if 判断条件1
执行语句1
elseif 判断条件2
执行语句2
...
...
else
执行语句n
end
具体实例:
% 判断数字是正数、负数还是0
a=1;
if a>0
disp('正数');
elseif a<0
disp('负数');
else
disp('0');
end
6.1.2 switch结构
if结构的基本结构如下:
switch (判断条件)
case 结果1
执行语句1
...
...
otherwise,
执行语句n
end
其中otherwise是可选的,当所有的结果都不符合时就会被执行。
具体实例:
switch (1+1)
case 1
disp('1+1=1');
case 2
disp('1+1=2');
otherwise
disp('我什么都不知道');
end
6.1.3 try/catch结构
try/catch结构是一种特殊的条件语句,只有发生异常时catch中的内容才会执行。
try/catch的基本结构如下:
try
语句1
语句2
...
catch
语句n
...
end
具体实例如下:
try
a=1/0;
catch
disp('我在写bug');
end
6.2 循环结构
6.2.1 while 循环
while循环是一个重复次数不确定的语句块,基本结构如下:
while 条件
语句1
语句2
...
end
如果条件非零,则循环内的语句执行,直到条件为0。具体实例如下:
%计算3的阶乘
result=1;
n=3;
while n>1
result=result*n;
n=n-1;
end
disp(result);
6.2.2 for 循环
for 循环是指定循环次数的语句块,其基本结构如下:
for index=x:s:n %x:起始位置;s:步长;n:终止位置
语句1
...
语句n
end
具体实例如下:
%计算从1加到100
n=100;
result=0;
for x=1:n
result=result+x;
end
disp(result)
6.3 continue和break语句
continue和break语句可以控制跳出循环。
continue:终止本次循环,执行下一次循环。
break:终止所在循环的整个循环语句。
七、M脚本文件
这里介绍的可能有点不及时了,上面已经使用过M脚本文件了。
7.1 什么是M脚本文件
(1)该文件中的指令形式和前后位置与解决同一个问题时在指令窗口输入的那组指令没有任何区别。
(2)MATLAB在运行这个文件时,只是简单地从文件中读取一条条指令,送到MATLAB中执行。
(3)文件扩展名“m”。
7.2 M脚本文件常用的一些函数
函数名 | 描述 |
---|---|
beep | 让计算机尖叫 |
disp(变量) | 只显示结果,不显示变量名 |
echo | 在M脚本文件被执行时,控制M脚本文件内容是否在Command窗口中显示 |
input | 提示用户输入数据 |
keyboard | 临时终止M文件的执行,让键盘获得控制权,回车键取消。 |
pause | 暂停,直到用户按下任意键或到指定时间后为止 |
waitforbuttonpress | 暂停,直到用户按下鼠标或其他按键为止 |
7.3 变量的一些介绍
Matlab的变量不需要事先定义。Matlab能识别一般常用的加减乘除运算,对于简单地计算可以字命令窗口中输入表达式,摁【Enter】键即可完成。Matlab会自动的将运算结果存入默认变量 ans 中,并显示其结果(如果表达式后加上“;”,则不会显示),用户可自行设定自己的变量。
下面介绍一些Matlab中的特殊变量:
变量名 | 变量含义 |
---|---|
ans | Matlab中默认变量 |
pi | 圆周率π |
eps | 返回某数的最小浮点数精度 |
inf | 无穷大 |
NaN | 非数 |
i(j) | 复数中的虚数单位 |
nargin | 所用函数的输入变量数目 |
nargout | 所用函数的输出变量数目 |
realmin | 最小可用正实数 |
realmax | 最大可用正实数 |
八、M函数文件
函数能够把大量有用的数学公式或者命令集中在一个模块中,因此,他们对某些复杂问题有很强的解决能力。
8.1 M函数文件的构建规则
下面罗列一些M函数文件的标准
(1)M函数文件名必须和function声明行中的函数名一致。实际上,当用户输入一个M函数并执行时,Matlab寻找的是以这个函数的名字命名的.m文件,而不是function声明中的函数名。
(2)M函数的命名规则:
- 以字母开头,后面任意的字母,数字,下划线的组合。
- 不能超过63个字符,超出则不显示。
- 与文件名一致
(3)介于函数声明和第一行命令之间的若干行注释一般作为函数的帮助文档,当使用help命令查看时将显示这一部分内容。
下面通过一个例子说明规则:
该文件为 myFunction命名的M函数文件。
function result = myFunction(var) %第一行位函数的声明
% 声明和命令之间的为函数帮助文档部分
%求正切的方法
% result 表示返回的结果变量,可多个返回值(中括号),调用函数得到的就是这个值
% var 表示函数的参数列表
result=tan(v); % 函数的主题部分
8.2 函数句柄
介绍一种函数的高级使用方式:函数句柄。一句话介绍函数句柄就是:将一个函数封装成一个变量。使函数能够更方便的在不同文件中调用,并快速使用。当一个函数句柄被创建是,它将记录函数的详细信息,因此,当使用一个函数句柄调用该函数时,Matlab会立即执行而不需要再进行文件搜索。
下面通过几个的例子了解怎么使用:
%% 句柄的创建方式一: 方法名=@方法名
myFunction1=@cos;
myFunction1(pi)
%% 句柄的创建方式二: 方法名=@(变量名) 方法体
myFunction2=@(x) x^2;
myFunction2(2)
%% 句柄的创建方式三: 方法名=str2func('方法名')
myFunction3=str2func('tan');
myFunction3(pi/4)
函数还有很多用法,想赶赶进度,暂时先整理这些,后续有机会再补上。
九、二维图形
Matlab可以表示数据的二维、三维和四维图形。通过对图形的线型、立面、色彩、光线、视角等属性的控制,可把数据的内在特征表现的更加细腻和完美。本章介绍二维图形的绘制和图形的处理。
9.1 plot()函数
9.1.1 基本调用格式
绘制二维图形最常用的函数就是plot()函数,通过不同形式的输入,该函数可以实现不同的功能,其基本调用格式如下:
plot(y)
此命令中参数y可以是向量、实数矩阵或复数向量。
若y为向量,则绘制的图形以向量索引位横坐标值、以向量元素的值为纵坐标值;
若y为实数矩阵,则绘制y的列向量对其坐标索引的图形,plot函数将绘制Y的列与行号之间的关系。x轴的刻度范围是从1到Y的行数。这里有点难理解。举个例子:以矩阵的第一列为例,第一列的行号就是横坐标,第一列的元素就是纵坐标,以此类推。
若y为复数向量,则plot(y)相当于plot(real(y),imag(y))
例如:用plot(y)命令绘制向量:
t=1:.1:2*pi; %横坐标
y=sin(t); %纵坐标
plot(y)
9.1.2 plot()的衍生调用格式
plot()函数的衍生调用格式如下:
plot(x,y) % 绘制连线图
x,y均可为向量和矩阵,其中有三种组合用于绘制连线图。
当x、y均为n维向量时,绘制向量y对向量x的图形,即以x为横坐标,y为纵坐标。
当x为n维向量,y为mxn或nxm的矩阵时,该命令将在同一图中绘制m条不同颜色的连线。图中以向量x为m条连线的公共横坐标,纵坐标为y矩阵的m个n维分量。
当x、y均为mxn矩阵时。将绘制n条不同颜色的连线。绘制规则为:以x矩阵的第i列分量作为横坐标,矩阵y的第i列分量作为纵坐标,绘制一条连线。
例如:用plot(x,y)绘制双向量时:
x=1:.2:20;
y=cos(x);
plot(x,y);
再例如:用plot(x,y)绘制向量和矩阵:
x=0:0.2:2*pi;
y=[sin(x);cos(x)];
plot(x,y)
plot()还有一些可以控制其属性的参数,最常用的一种调用个数如下:
plot(x,y,s)
此格式用于绘制不同线性、点标和颜色的图形,其中s为字符,也是图形的控制参数。常见的可用字符及其意义如下表:
符号 | 颜色 | 符号 | 标记 | 符号 | 线性 |
---|---|---|---|---|---|
b | 蓝色 | . | 点号 | - | 实线 |
g | 绿色 | o | 圆圈 | : | 点线 |
r | 红色 | x | 叉号 | -. | 点划线 |
c | 青色 | + | 加号 | – | 虚线 |
m | 洋红 | * | 星号 | V | 向下三角形 |
y | 黄色 | s | 方形 | p | 五角星 |
k | 黑色 | d | 菱形 | h | 六角星 |
w | 白色 | ︿ | 向上三角形 | < | 向左三角形 |
例如:用plot(x,y,s)绘图:
x=0:0.2:2*pi;
y=tan(x);
plot(x,y,'--r*');
除了这些,plot()函数还提供了很多额外的属性可供调用,这里只做一部分概述,其具体格式如下:
plot(x,y,'s','属性名','属性值')
一些常用的属性名和属性值见下表:
含义 | 属性名 | 属性值 |
---|---|---|
点、线颜色 | Color | [vr,vg,vb],RGB三元组可在[0,1]中任取值,同s |
线型 | LineStyle | 4种线型,同s |
线宽 | LineWidth | 正实数,默认为0.5 |
数据点形 | Marler | 14种点型,同s |
点的大小 | MarkerSize | 正实数,默认为6.0 |
点的边界颜色 | MakerEdgeColor | 同Color属性 |
点域色彩 | MakerFaceColor | 同Color属性 |
例如:
t=(0:pi/50:2*pi)';
k=0.4:0.1:1;
Y=sin(t)*k;
plot(t,Y,'LineWidth',1.5)
9.2 坐标的控制及图形标识
9.2.1 坐标轴的控制
对坐标轴的控制主要通过axis命令完成,下面简单罗列一些最常用的命令:
命令 | 描述 |
---|---|
axis([xmin xmax ymin ymax]) | 设置当前图形的坐标范围 |
V=axis | 返回包含当前坐标范围的行向量 |
axis auto | 将坐标值的刻度恢复为自动的默认设置 |
axis manual | 冻结坐标轴刻度 |
axis tight | 将坐标范围设定为被绘制的数据范围 |
axis fill | 设置坐标范围和屏幕高宽比,使坐标轴可以包含整个绘制区域 |
axis ij | 将坐标轴设置为矩阵模式 |
axis xy | 将坐标轴设置为笛卡尔模式 |
axis equal | 设置屏幕高宽比,使得每个坐标轴具有均匀的刻度间隔 |
axis image | 设置坐标范围,使其域被显示的图形相适应 |
axis square | 将坐标轴框设置为正方形 |
axis normal | 将当前的坐标轴恢复为全尺寸,取消单位刻度的限制 |
axis vis3d | 冻结屏幕高宽比 |
axis off | 关闭所有坐标轴标签、刻度和背景 |
axis on | 打开所有坐标轴标签、刻度和背景 |
例子如下:
x=linspace(0,2*pi,30);
y=cos(2*x);
plot(x,y)
axis([0 2*pi -1.5 2]) %设置坐标显示范围
除了这些,对于坐标轴的标注可以使用xlabel()和ylabel()函数完成,其基本格式如下:
xlabel('横坐标标识','属性名','属性值'...)
ylabel('纵坐标标识','属性名','属性值'...)
例子如下:
x=1:10;
y=x;
plot(y)
xlabel('x','fontweight','bold')
ylabel('y','fontweight','bold')
9.2.2 图形的文本标注
在Matlab中可以使用text或gtext命令对图形进行文本注释。
使用text进行标注时需要定义用于注释的文本字符串和放置注释的位置。而使用gtext命令进行标注时却可以使用鼠标来选择标注文字放置的位置。
调用格式如下:
text(x,y,'标注内容')
text(x,y,z,'标注内容')
text(x,y,z,'标注内容','属性名','属性值'....)
gtext('标注内容')
gtext({'标注内容1','标注内容2','标注内容3',....})
gtext({'标注内容1';'标注内容2';'标注内容3';....})
例子如下:
x=0:0.1*pi:3*pi;
y=sin(x);
plot(x,y)
text(pi/2,sin(pi/2),'\leftarrowsin(x)=1','FontSize',12)
9.2.3 图例的标注
在对数值结果进行绘图时,经常会出现一张图中绘制多条曲线的情况,这时读者可以使用legend()函数为曲线添加图例以便区分它们。该函数能为图形中的所有曲线进行自动标注,并以输入变量作为标注文本。其调用格式如下:
legend('标注1','标注2',...,'位置','位置')
该函数中‘标注1’,‘标注2’分别标注对应绘图过程中按绘制顺序所生成的曲线。'位置’则表示图例的位置属性,具体可去搜。
例如:
x=0:pi/30:3*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,'k-',x,y2,'r.')
h=legend('sin','cos','Location','north');
9.3 叠绘、双纵坐标和多子图
9.3.1 叠绘
用户可以使用hold命令在一个已经存在的图形上添加一个新的图形。当用户输入hold on命令时,用户输入新的plot()函数,Matlab不会将现存的坐标轴删除。
hold on命令在保持原有的图形基础上添加新的绘制图形。
hold off命令则是关闭此功能,使当前轴及图形不再具备刷新的性质。
例子如下:
x=0:pi/30:3*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,'k-')
hold on
plot(x,y2,'r.')
9.3.2 双纵坐标图
双坐标轴图可以利用下列函数获得。格式如下:
plotyy(x1,y1,x2,y2) %以左、右不同纵坐标绘制x1-y1、x2-y2曲线
plotyy(x1,y1,x2,y2,'FUN')%以左右不同纵坐标把图形绘制才能FUN指定的两条曲线。
plotyy(x1,y1,x2,y2,'FUN1','FUN2')%绘制成FUN1、FUN2指定的不同形式的两条曲线
例子如下:
x=0:0.2:4;
y=cos(x);
s=sin(x);
plotyy(x,y,x,s);
还有一种双纵坐标的实现方式也是Matlab推荐使用的方法,即yyaxis命令。该命令通过控制横坐标和纵坐标左右的关联性来实现双纵坐标,命令如下:
yyaxis left %与左侧纵坐标产生关联
yyaxis right %与右侧坐标产生关联
yyaxis (ax,_) %自定义哪边
例子如下:
x = linspace(0,10);
y = sin(3*x);
yyaxis left
plot(x,y)
z = sin(3*x).*exp(0.5*x);
yyaxis right
plot(x,z)
ylim([-150 150])
9.3.3 多子图
使用subplot()函数完成多子图操作,调用形式如下:
subplot(m,n,k)
其中m*n表示子图的个数,k表示当前图号。
例子如下:
x=1:10;
y=x;
z=1/2*x;
t=x.^2;
u=sin(x);
subplot(2,2,1);
plot(x,y)
subplot(2,2,2);
plot(x,z)
subplot(2,2,3);
plot(x,t)
subplot(2,2,4);
plot(x,u)
———————2023/3/16 22:17 (肝不动了)————————
9.4 其他二维绘图函数
除了plot()函数外,Matlab还提供了很多其他的常用函数。这里只介绍fplot()、ezplot()、ginput(),最后将以表格的形式展示更多的绘图函数。
9.4.1 fplot()函数
plot()函数将从外部输入或通过函数值计算得到的数据矩阵转化为连线图。在某些情况下,如果不知道某一个函数随自变量的变化趋势,此时采用Plot()函数来绘图,则可能因为自变量的取值间隔不合理而使曲线图形不能适应自变量在某些区域内函数值的变化。
而fplot()函数则可以很好的解决这个问题。fplot()函数用于指导如何通过函数来取得绘图的数值点矩阵。该函数通过内部的自适应算法来动态的决定自变量的取值间隔,当函数变化缓慢时,间隔取大些;变化剧烈时,间隔取小些。
该函数的使用格式如下:
fplot('function','limits','LinSpec','tol','n','LineSpec')
各参数的含义:
- function:待绘制函数名
- limits:定义x、y轴的范围,[xmin xmax ymin ymax]
- LinSpec:定义绘图的样式
- tol:相对容忍误差
- n:n≥1时,至少绘制n个点。
一个简单的例子:
ff=@tan;
fplot(ff,[-3,6]);
9.4.2 ezplot()函数
ezplot()函数也用于绘制某一自变量区域内的图形,其使用格式如下:
%一、当f=f(x)时:
ezplot(f) %绘制f=f(x)在-2π<x<2π的图形,f为函数句柄
ezplot(f,[min,max]) %绘制f=f(x)在min<x<max区域内的图形
%二、当f=f(x,y)时:
ezplot(f) %绘制f=f(x,y)=0在-2π<x<2π,2π<y<-2π内的图形
ezplot(f,[xmin,xmax,ymin,ymax]) %绘制该范围的图形
ezplot(f,[min,max])%绘制 min<x<maxa,min<y<max内的图形
%三、参数方程形式:
ezplot(x,y) %绘制x=x(t),y=y(t)在0<t<2π上的图形
ezplot(x,y,[tmin,tmax]) %绘制在 tmin<t<tmax内的图形
%指定句柄
ezplot(...,figure_handle)%在句柄为figure_handle窗口绘制图形
ezplot(axes_handle,...)%在句柄为axes_handle的坐标系绘制图形
一个简单的例子:
ezplot('x^4-y^6')
9.4.3 ginput()函数
挺好玩的一个函数,直接给段代码,自己试试就明白了:
clf
x=-1:0.01:5;
y=(x+3).^x-5;
plot(x,y)
grid on %添加网格线
[x,y]=ginput(1);
[x,y]
9.5 统计图
9.5.1 饼状图
Matlab中的饼状图通过pie()函数实现,调用格式如下:
pie(x) %x表示数值向量
pie(x,y) %y是对应x在饼图中的偏移量
例如:
x=[0.1,0.2,0.4,0.2,0.1];
y=[0,0.3,0,0,0];
pie(x,y)
9.5.2 柱状图
Matlab中的柱状图通过bar()函数实现,调用格式如下:
bar(y) %每个y为一个条状
bar(x,y) %在指定的横坐标x上画y
bar(...,width,color,...) %width/color:对应条状的宽度和颜色
一个简单的例子:
x=-2.5:0.25:2.5;
y=2*exp(-x.*x);
bar(x,y,'b')
9.5.3 离散序列
Matlab中的离散数据序列可以通过stem()函数实现,调用格式如下:
stem(z) %生成一个向量z的数据点图形,其中各个点用一条直线和水平坐标轴相连
stem(x,z) %将z中的数据与x对应
一个简单的例子:
z=randn(20,1);
stem(z,'-')
9.6 二维绘图函数总结
函数名 | 描述 |
---|---|
plot | 线性绘图 |
loglog | 对数坐标轴绘图 |
semilogx | 半对数坐标轴(x)绘图 |
semilogy | 半对数坐标轴(y)绘图 |
polar | 极坐标绘图 |
plotyy | 双y轴线性绘图 |
axis | 用于控制坐标轴的刻度和外观 |
xlim | 设置x轴的坐标范围 |
ylim | 设置y轴的坐标范围 |
zlim | 设置z轴的坐标范围 |
daspect | 设置和获取数据高宽比,例如,axis equal |
pbaspect | 设置和获取屏幕的高宽比,例如,axis square |
zoom | 图形的放大缩小 |
grid | 显示和隐藏网格线 |
Box | 显示和隐藏坐标轴边框 |
hold | 保持当前的图形 |
subplot | 用于在同一图形窗口中生成多个坐标轴 |
figure | 用于生成图形窗口 |
legend | 添加图例 |
title | 在图形的顶部添加标题 |
xlabel | 添加x轴标注 |
ylabel | 添加y轴标注 |
text | 在图形中放置文本 |
gtext | 在鼠标单击处放置文本 |
ginput | 获取鼠标单击处的坐标 |
area | 填充一个图形与横坐标之间的区域 |
bar | 绘制条形图 |
barth | 绘制水平条形图 |
bar3 | 绘制三维条形图 |
bar3th | 绘制三维水平条形图 |
compass | 绘制绕行曲线 |
errorbar | 绘制误差线段 |
ezplot | 利用字符串表达式绘制线形图 |
ezploar | 利用字符串表达式绘制极坐标图 |
feather | 绘制羽状图 |
fill | 绘制实心的二维多边形 |
fplot | 利用给定的函数绘图 |
hist | 绘制直方图 |
pareto | 绘制pareeto图 |
pie | 绘制饼状图 |
pie3 | 绘制三维饼状图 |
plotmatrix | 绘制矩阵散布图 |
ribbon | 将二维线以线性方式绘制成三维的带状 |
scatter | 绘制散点图 |
stem | 绘制离散序列的柄状图 |
stairs | 绘制阶梯图 |
——————————(2023/3/17 11:53)—————————
十、三维图形
10.1 三维绘图函数
三维绘图涉及的内容十分庞大,仅凭本人的描述很难概括全面,又因为本人方向暂不涉及这方面,本章主要以了解大致内容为目的来介绍。
10.1.1三维基本绘图—— plot3()函数
plot3()是三维绘图的基本函数,其用法和plot()函数基本一样,只是在绘图时需要提供至少三个参数,其调用格式如下:
plot3(x1,y1,z1,...)
plot3(xi,y1,z1,LineSpec,...)
plot3(...,'PropertyName','ProppertyValue')
参数意义如下:
- x1,y1,z1为向量或矩阵
- LineSpac定义曲线线性、颜色和数据点灯
- PropertyName、PropertyValue为线对象的属性名和属性值
简单的例子:
t=0:pi/50:10*pi;
plot3(sin(t),cos(t),t);
10.1.2 三维网线图的绘制——mesh()函数
三维网线图的绘制函数是mesh()。Matlab用x-y平面上的z坐标来定义一个网格面,它通过将相邻的点用直线连接构成一个网格面,网格节点是z中的数据点。
mesh()函数的调用格式如下:
%x,y为向量,若x,y的长度为m和n则[m,n]=size(z),
%此种情况网格线的顶点为(x(j),y(i),z(i,j))
mash(x,y,z)
%若没有提供x,y则将(i,j)作为z(i,j)的x,y轴坐标值
mesh(Z)
% C定义颜色,若没有C则随机颜色
mesh(...,C)
mesh(....,'PropertyName','PropertyValue',...)
一个简单的例子:
[x,y,z]=peaks(30); %peaks函数图像
mesh(x,y,z)
10.1.3 三维表面图的绘制——surf()函数
三维表面图绘制函数surf()的调用方法与mesh()类似,不同的是mesh()函数绘制的图形是一个网格图,而surf()绘制得到的是着色的三维表面图。
调用方式如下:
surf(x,y,z)
surf(Z)
surf(...,C)
surf(....,'PropertyName','PropertyValue',...)
一个简单的例子:
x=0:0.2:2*pi;
y=0:0.2:2*pi;
z=sin(x')*cos(2*y);
surf(x,y,z)
10.2 特殊图形的绘制
10.2.1 三维特殊图形函数
除了上述的绘图函数外,Matlab还提供了一些专用的三维绘图函数,如cylinder()、sphere()和stem3()等。
① 圆柱的绘制——cylinder()函数
cylinder()函数的调用格式如下:
[x,y,z]=cylinder %返回半径为1,高度为1的圆柱体的x、y、z轴的坐标值,圆柱的圆周有20个等距离的点。
[x,y,z]=cylinder(r) %返回半径为r,高度为1的圆柱体。。。。
[x,y,z]=cylinder(r,n) %返回半径为r,高度为1的圆柱体,有n个等距离的点
如:
cylinder(3)
② 球体的绘制——sphere()函数
sphere()函数用于生成球体,其调用格式如下:
sphere %生成一个单位球体,20*20个面组成
sphere(n) % n*n个面组成的球体
[x,y,z]=sphere(...)
如:
sphere(30)
③ 立体离散序列绘制——stem3()函数
stem3()函数用于绘制三维空间中的离散数据序列,其调用格式如下:
stem3(x,y,z,c,'filled')%filled表示是否填充颜色
一个简单的例子
z=rand(4);
stem3(z,'ro','filled')
10.2.2 等高线和带状图
① 等高线
等高线用于绘制具有相同海拔或高度的曲线,二维等高线和三维等高线分别由函数contour()和countour3()绘制,例子如下:
[x,y,z]=peaks;
subplot(1,2,1)
contour(x,y,z,20)
axis square
subplot(1,2,2)
contour3(x,y,z,20)
pcolor()函数用不同的颜色代表不同的高度来绘制等高线,如下:
[x,y,z]=peaks;
pcolor(x,y,z)
② 带状图
函数ribbon(y)用于将数组y的各列画成一个个的带状,格式如下:
ribbon(x,y,width)
例子如下:
z=peaks;
ribbon(z)
三维绘图的内容远不止这些,这里暂时不更新了,后续有机会再补上。