1.退出MATLAB
关闭MATLAB桌面
在命令窗口执行quit或exit命令
2.开平方-sqrt(x)
3.指数函数exp(x)
4.clc清除窗口显示内容的命令
5.who、whos命令用来清除工作空间的变量
6.clear命令用来清除工作空间的变量
7.dir显示当前工作目录的文件和子目录清单
8.cd显示或设置当前工作目录
9.type显示指定m文件的内容
10.help或doc获取在线帮助
11.求方程2x^5-3x^3+71x^2-9x+13=0的全部跟
>> p=[2,0,-3,71,-9,13];
>> x=roots(p);
12.求解线性方程组2x+3y-z=2
8x+2y+3z=4
45x+3y+9z=23
>> a=[2,3,-1;8,2,3;45,3,9];%建立系数矩阵a
>> b=[2,4,23]%建立列向量b
>> x=inv(a)*b
13.求解积分0->1xln(1+x)
>> quad('x.*log(1+x)',0,1)
14.多项式曲线拟合
>> x=[1,2,3,4,5,6,7,8,9,10];
>> y=[1,2,3,4,5,4.7,5,5.2,6,7.2];
>> p1=polyfit(x,y,1)%一次多项式拟合
>> p3=polyfit(x,y,3)%三次多项式拟合
>> x2=1:0.1:10;
>> y1=polyval(p1,x2);
>> y3=polyval(p3,x2);
>> plot(x,y,'*',x2,y1,':',x2,y3)
15.函数linspace(x1,x2,n)
>> x=linspace(1,2,5)
x =
1.0000 1.2500 1.5000 1.7500 2.0000
16.ones(生成全1的矩阵)、zeros(生成全0的矩阵)
>> ones(3)
>> ones(3,4)
17.函数reshape()
>> a=-4:4
>> reshape(a,3,3)
18.画出y=1/(x+1)的函数曲线,x∈[0,100]
>> x=0:100;
>> y=1./(x+1);
>> plot(x,y);
>> legend('y=1/(x+1)');
19.生成一个信号x=sin(2*pi*t)+sin(4*pi*t)
>> t=[0:199]./100;%采样时间点
>> x=sin(2*pi*t)+sin(4*pi*t);%生成信号
>> plot(t,x);
>> legend('sin(2*pi*t)+sin(4*pi*t)');
20.判断方阵中的元素能否被3整除
>> A=[24,35,13;23,39,47;90,41,80];
>> P=rem(A,3)==0%被3整除,求余
21.在[0,3π]区间,求y=sinx的值。要求消去负半波,即[π,2π]区间内的函数值置零。
>> x=0:pi/100:3*pi;
>> y=sin(x);
>> y1=(y>=0).*y;%消去负半波
>> plot(y1);
22.求向量的最大值
>> x=[-43,72,9,16,23,47];
>> y=max(x)%求向量x中的最大值
>> [y,I]=max(x)%求向量x中的最大值及其该元素的位置
23.求矩阵的最大值
>> A=[24,35,13;23,39,47;90,41,80];
>> y=max(A)%求矩阵A中每列的最大值
>> [y,I]=max(A)%求矩阵A中每列的最大值及其该元素的位置
>> r2=max(A,[],2)%求矩阵A中每行的最大值
24.数据分析与统计
sum(x):返回向量x各元素的和;
prod(x):返回向量x各元素的乘积;
sum(x):返回一个行向量,其第i个元素是A的第i列的元素和;
prod(A):返回一个行向量,其第i个元素是A的第i列的元素乘积;
sum(A,dim):当dim为1时,该函数等同于sum(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的各元素之和;
prod(A,dim):当dim为1时,该函数等同于prod(A);当dim等于2时,返回一个列向量,其第i个元素是A的第i行的各元素乘积;
mean(x):返回向量x的算术平均值;
median(x):返回向量x的中值;
mean(A):返回一个行向量,其第i个元素是A的第i列的算术平均值;
median(A):返回一个行向量,其第i个元素是A的第i列的中值;
mean(A,dim):当dim为1时,该函数等同于mean(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的算术平均值;
median(A,dim):当dim为1时,该函数等同于median(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的中值;
25.数组元素的标识与寻访
size函数返回变量的大小,即变量数组的行列数;
length函数返回变量数组的最大维数;
sub2ind函数-双下标转换为单下标;>> sub2ind(size(A),2,2)
ind2sub函数-单下标转换为双下标;>> IND=sub2ind(size(A),2,2);>> [I,J]=ind2sub(size(A),IND)
26.单下标的使用
>> a=zeros(2,5);
>> a(:)=-4:5
a =
-4 -2 0 2 4
-3 -1 1 3 5
27.一维数组元素与子数组的寻访与赋值
>> a=linspace(1,10,5)
a =
1.0000 3.2500 5.5000 7.7500 10.0000
>> a(3)%寻访a的第3个元素
ans =
5.5000
>> a([1 2 5])%寻访a的第1、2、5个元素组成的子数组
ans =
1.0000 3.2500 10.0000
>> a(1:3)%寻访前3个元素组成的子数组
ans =
1.0000 3.2500 5.5000
>> a(3:-1:1)%由前3个元素倒序构成的子数组
ans =
5.5000 3.2500 1.0000
>> a(3:end)%第3个元素及其后的所有元素构成的子数组
ans =
5.5000 7.7500 10.0000
>> a(3:end)%第3个元素及其后的所有元素构成的子数组,end作为参数使用,返回最后一个元素的下标
ans =
5.5000 7.7500 10.0000
>> a([1 2 3 5 5 3 2 1])%数组元素可以被任意重复访问,构成长度大于原数组的新数组。
ans =
1.0000 3.2500 5.5000 10.0000 10.0000 5.5000 3.2500 1.0000
>> a(3)=0%修改数组a的第3个元素值为0
a =
1.0000 3.2500 0 7.7500 10.0000
>> a([2 5])=[1 1]%可以修改指定数组元素的值,一次可以修改多个数组元素的值,要修改的数组元素的个数应与送入数组的元素个数相同
a =
1.0000 1.0000 0 7.7500 1.0000
28.二维数组元素与子数组的寻访与赋值
>> a_2=zeros(2,4)%创建2*4的全0数组
a_2 =
0 0 0 0
0 0 0 0
>> a_2(:)=1:8
a_2 =
1 3 5 7
2 4 6 8
>> a_2([2 5 8])%单下标方式寻访多个元素
ans =
2 5 8
>> a_2([2 5 8])=[10 20 30]
a_2 =
1 3 20 7
10 4 6 30
>> a_2(:,[2 3])=ones(2)%双下标方式寻访并修改
a_2 =
1 1 1 7
10 1 1 30
29.字符串
>> str1='I like MATLAB,';%建立字符串str1
>> str2='Java,and Python!';%建立字符串str2
>> str3=[str1 str2]%直接连接str1及str2,进而建立str3
str3 =
I like MATLAB,Java,and Python!
>> sentence='I ''ve got a date!';%如果输入的字符串中有单引号,则由两个连续的单引号来表示
>> length(sentence)%计算字符串sentence的长度
ans =
17
>> sentenceAscii=double(sentence)%查看字符串sentence的ASCII码
sentenceAscii =
73 32 39 118 101 32 103 111 116 32 97 32 100 97 116 101 33
>> sentence2=char(sentenceAscii)%将ASCII码恢复成字符串形式
sentence2 =
I 've got a date!
>> Chinese='今日事,今日毕';
>> out1=class(Chinese)%out1的值是“char”
out1 =
char
>> out2=ischar(Chinese)%out2的值是1,代表Chinese是字符串变量
out2 =
1
>> x=Chinese+1;
>> out3=ischar(x)%out3的值是0,代表x不是字符串变量
out3 =
0
30.字符串的比较
>> str1='today';
>> str2='tomorrow';
>> str3='today';
>> out1=strcmp(str1,str2)%比较字符串str1和str2
out1 =
0
>> out2=strcmp(str1,str3)%比较字符串str1和str3
out2 =
1
31.数组维数的减小
>> a=magic(4),a(:,2)=[]
a =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
a =
16 3 13
5 10 8
9 6 12
4 15 1
>> a(1,2)=[]
带有下标的赋值维度不匹配。
>> a(2:4)=[]%数组a将变为向量
a =
16 3 10 6 15 13 8 12 1
32.元胞数组的创建
Cell indexing方式创建元胞数组
>> c(1,1)={[1 4 3;0 5 8;7 2 9]}
c =
[3x3 double]
>> c(1,2)={'Anne Smith'}
c =
[3x3 double] 'Anne Smith'
>> c(2,1)={3+7i}
c =
[3x3 double] 'Anne Smith'
[3.0000 + 7.0000i] []
>> c(2,2)={-pi:pi/10:pi}
c =
[3x3 double] 'Anne Smith'
[3.0000 + 7.0000i] [1x21 double]
>> class(c)
ans =
cell
Content indexing方式创建元胞数组
>> b{1,1}='James'
b =
'James'
>> class(b)
ans =
cell
>> b{1,2}=[1 2;3 4;5 6]
b =
'James' [3x2 double]
>> b{2,1}=pi
b =
'James' [3x2 double]
[3.1416] []
>> b{2,2}=zeros(5)
b =
'James' [3x2 double]
[3.1416] [5x5 double]
33.元胞数组的连接
>> a=[b c]
a =
'James' [3x2 double] [3x3 double] 'Anne Smith'
[3.1416] [5x5 double] [3.0000 + 7.0000i] [1x21 double]
>> a=[b;c]
a =
'James' [3x2 double]
[ 3.1416] [5x5 double]
[3x3 double] 'Anne Smith'
[3.0000 + 7.0000i] [1x21 double]
34.显示元胞数组的内容
>> a(2,2)={-pi:pi/10:pi}
a =
[3x3 double] 'Anne Smith'
[3.0000 + 7.0000i] [1x21 double]
>> celldisp(a)%显示全部内容
a{1,1} =
1 2 3
4 5 6
7 8 9
a{2,1} =
3.0000 + 7.0000i
a{1,2} =
Anne Smith
a{2,2} =
Columns 1 through 11
-3.1416 -2.8274 -2.5133 -2.1991 -1.8850 -1.5708 -1.2566 -0.9425 -0.6283 -0.3142 0
Columns 12 through 21
0.3142 0.6283 0.9425 1.2566 1.5708 1.8850 2.1991 2.5133 2.8274 3.1416
>> cellplot(a)%图形方式显示元胞数组的结构
>> a{1,2}%使用内容下标索引显示指定元胞的数据
ans =
Anne Smith
>> a{:}%一次显示a的全部数据
b =
'James' [3x2 double]
[3.1416] [5x5 double]
>> b,d=b{1,2}%读取b元胞数组的第1行、第2列元胞的内容
b =
'James' [3x2 double]
[3.1416] [5x5 double]
d =
1 2
3 4
5 6
>> e=b{1,2}(3,1)%读取b{1,2}的第3行、第1列的数据
e =
5
>> f=a(1,:)%读取元胞数组a第一行的所有元胞
f =
[3x3 double] 'Anne Smith'
>> a(1,:)=[]%删除元胞数组a第一行的所有元胞
a =
[3.0000 + 7.0000i] [1x21 double]
35.结构数组变量的创建
方法一:直接键入
Exam:创建一个关于学生信息的结构数组,每个结构包含学生姓名(name)、学号(id)、成绩(scores)。
>> clear student%清除student变量
>> student.name='张三';%加入name字段
>> student.id='mr871912';%加入id字段
>> student.scores=[58,75,62];%加入scores字段
>> student%显示结构变量的数据
student =
name: '张三'
id: 'mr871912'
scores: [58 75 62]
>> student(2).name='张宁';
>> student(2).id='mr871913';
>> student(2).scores=[68,85,92];
>> student
student =
1x2 struct array with fields:
name
id
scores
>> student(1)
ans =
name: '张三'
id: 'mr871912'
scores: [58 75 62]
方法二:struct函数
格式:Structure Array_var_name=struct(field1,value1,field2,value2,...),field1、field2、...是结构的字段名,value1、value2、...
则是相应字段所包含的数据。
Exam:使用struct创建结构数组变量
>> clear student
>> student=struct('name','张听说','scores',[50 60]);
>> student(2)=struct('name','张延安','scores',[60 70]);
>> student(1),student(2)
Exam:使用struct创建结构数组变量(一次建立多个元素)
>> clear student
>> student=struct('name',{'张婷说','张延安'},'scores',{[50 60],[60 70]});
>> student(1),student(2)
ans =
name: '张婷说'
scores: [50 60]
ans =
name: '张延安'
scores: [60 70]
36.结构数组嵌套:结构数组中结构的字段还可以是结构
>> student(2).course(1).title='Web Programming';
>> student(2).course(1).credits=2;
>> student(2).course(2).title='Numerical Method';
>> student(2).course(2).credits=3;
>> student(2).course
ans =
1x2 struct array with fields:
title
credits
>> student(1).name='Newton';%修改结构数组变量的字段值
>> student(1).name
ans =
Newton
37.cat函数:排列结构数组某字段的值
格式:cat(dim,structurefield),dim=1,竖排;dim=2,横排。
>> cat(1,student.scores)
ans =
50 60
60 70
>> cat(2,student.scores)
ans =
50 60 60 70
38.计算平均值(使用mean函数)
计算每次考试的平均值
>> average1=mean(cat(1,student.scores))
average1 =
55 65
计算每个学生成绩的平均值
>> average2=mean(student(2).scores)
average2 =
65
39.二维曲线绘图的基本操作
(1)plot(x),x为向量时,以该元素的下标为横坐标、元素值为纵坐标绘出曲线。
(2)plot(x,y),x、y为同维数组时,绘制以x、y元素为横纵坐标的曲线。
(3)plot(x1,y1,x2,y2,...),绘制以x1为横坐标、y1为纵坐标的曲线1,以x2为横坐标、y2为纵坐标的曲线2,等等。其中x为横坐标,y为纵坐标,绘
制y=f(x)函数曲线。
Exam:在[0,2π]区间内,绘制曲线2e^-0.5xsin(2πx)。
>> x=0:pi/100:2*pi;
>> y=2*exp(-0.5*x).*sin(2*pi*x);
>> plot(x,y)
Exam:绘制曲线x=tcos(3t)、y=t(sint)^2,-π≤t≤π。
>> t=-pi:pi/100:pi;
>> x=t.*cos(3*t);
>> y=t.*sin(t).^2;
>> plot(x,y)
40.绘制复杂曲线
Exam:用图形表示连续调制波形及其包络线。
>> t=(0:pi/100:pi)';%长度为101的时间采样列向量
>> y1=sin(t)*[1,-1];%包络线函数值,是(101*2)的矩阵
>> y2=sin(t).*sin(9*t);%长度为101的调制波列向量
>> t3=pi*(0:9)/9;
>> y3=sin(t3).*sin(9*t3);
>> plot(t,y1,'r',t,y2,'b',t3,y3,'bo')
>> axis([0,pi,-1,1])
41.重绘曲线
Exam:重绘波形y=sin(t)sin(9t)及其包络线。
>> plot(t,y1,'r:')
>> hold on
>> plot(t,y2,'b')
>> plot(t3,y3,'bo')
>> axis([0,pi,-1,1])
>> hold off
42.利用hold绘制离散信号的波形
>> t=2*pi*(0:20)/20;
>> y=cos(t).*exp(-0.4*t);
>> stem(t,y,'g');
>> hold on
>> stairs(t,y,'r');
>> hold off
43.双纵坐标:plotyy指令
调用格式:plotyy(x1,y1,x2,y2),x1-y1曲线y轴在左,x2-y2曲线y轴在右
>> x=0:0.01:20;
>> y1=200*exp(-0.05*x).*sin(x);
>> y2=0.8*exp(-0.5*x).*sin(10*x);
>> plotyy(x,y1,x,y2);
44.多子图
subplot(m,n,k):使(m*n)幅子图中第k个子图成为当前图;其编号原则:左上方为第1子图,然后向右向下一次排序。
subplot('position',[left,bottom,width,height]):在指定的位置上开辟子图,并成为当前图;用于手工指定子图位置,指定位置的四元组采
用归一化的标称单位,即认为整个图形窗口绘图区域的高、宽的取值范围都是[0,1],而左下角为(0,0)坐标。
>> t=(pi*(0:1000)/1000)';
>> y1=sin(t);
>> y2=sin(10*t);
>> y12=sin(t).*sin(10*t);
>> subplot(2,2,1);
>> subplot(2,2,1),plot(t,y1);
>> axis([0,pi,-1,1])
>> subplot(2,2,2),plot(t,y2);
>> axis([0,pi,-1,1])
>> subplot('position',[0.2,0.2,0.2,0.2]),plot(t,y12);
45.绘制图形的辅助操作
>> t=(0:15)*2*pi/15;
>> y=sin(t);
>> subplot(3,2,1),plot(t,y);title('Lins style is default')%默认
>> subplot(3,2,2),plot(t,y,'o');title('Lins style is o')%圆圈
>> subplot(3,2,3),plot(t,y,'k:');title('Lins style is k:')%黑虚线
>> subplot(3,2,4),plot(t,y,'k:*');title('Lins style is k:*')%黑虚线八线符
>> subplot(3,2,5),plot(t,y,'m-d');title('Lins style is m-d')%品红实线菱形符
>> subplot(3,2,6),plot(t,y,'r-p');title('Lins style is r-p')%红实线五角星符
46.绘制椭圆,长轴为3.25,短轴为1.15
>> x=1.15*cos(t);y=3.25*sin(t);%y为长轴,x为短轴
>> subplot(2,2,1);plot(x,y);
>> axis off%不显示坐标轴
>> title('axis off')
>> subplot(2,2,2);plot(x,y);
>> axis image;%纵、横坐标等长刻度,坐标框紧贴数据范围
>> title('axis image')
>> subplot(2,2,3);plot(x,y);
>> axis equal;%纵、横坐标等长刻度
>> subplot(2,2,4);plot(x,y);
>> axis square;%产生方形坐标系
>> title('axis square');
47.分格线与grid指令
grid on(画出分格线);
grid off(不画分格线),缺省设置;
>> t=6*pi*(0:100)/100;
>> y=1-exp(-0.3*t).*cos(0.7*t);
>> tt=t(find(abs(y-1)>0.05));
>> ts=max(tt);
>> plot(t,y,'r-');
>> grid on;
>> axis([0,6*pi,0.6,max(y)]);
>> title('y=1-exp(-\alpha*t)*cos(\omega*t)');
>> hold on;
>> plot(ts,0.95,'bo');
>> hold off;
>> set(gca,'xtick',[2*pi,4*pi,6*pi],'ytick',[0.95,1,1.05,max(y)]);
>> grid on;
48.在正弦曲线上标注特殊值
>> t=(0:100)/100*2*pi;
>> y=sin(t);
>> plot(t,y);
>> text(3*pi/4,sin(3*pi/4),'\fontsize{16}\leftarrowsin(t)=.707');
>> text(pi,sin(pi),'\fontsize{16}\leftarrowsin(t)=0');
>> text(5*pi/4,sin(5*pi/4),'\fontsize{16}sin(t)=-.707\rightarrow','HorizontalAlignment','right')
%'HorizontalAlignment','right'设置图形标识为水平右对齐
>> t=0:900;
>> plot(t,0.25*exp(-0.005*t));
>> title('\fontsize{16}\itAe^{\alphat}');
>> text(300,.25*exp(-0.005*300),'\fontsize{14}\leftarrow0.25\ite^-0.005\itt_at\itt=300');
49.特殊图形(直方图(柱形图)bar)
>> x=-2.9:0.2:2.9;
>> bar(x,exp(-x.*x),'r');
例如:北京市从业人员统计
(累计式直方图一(竖着))
>> year=[1990 1995 2000];
>> people=[90.7 281.6 254.8;70.6 271 323.7;73.9 214.6 326.5];
>> bar(year,people,'stack');
>> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');
(累计式直方图二(横着))
>> barh(year,people,'stack');
>> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');
(分组式直方图一(竖着))
>> bar(year,people,'group');%分组式直方图
>> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');
(分组式直方图二(横着))
>> barh(year,people,'group');
>> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');
50.饼图指令pie
饼图指令pie用来表示各元素占总和的百分数。该指令第二输入变量是与第一变量同长的0-1向量,1使对应扇块突出。
>> a=[1,1.6,1.2,0.8,2.1];
>> subplot(1,2,1),pie(a,[1 0 1 0 0]),legend({'1','2','3','4','5'});
>> subplot(1,2,2),b=int8(a==min(a));
>> pie3(a,b);
>> colormap(cool);
51.离散杆图stem
例如,余弦波的采样信号图
>> t=linspace(-2*pi,2*pi,20);
>> h=stem(t,cos(t));
例如,分别以条形图、填充图、阶梯图和杆图形式绘图
>> subplot(221);
>> bar(x,y,'g');
>> title('bar(x,y,''g'')');
>> subplot(222);
>> fill(x,y,'r');
>> title('fill(x,y,''r'')');
>> subplot(223);
>> stairs(x,y,'b');
>> title('stairs(x,y,''b'')');
>> subplot(224);
>> stem(x,y,'k');
>> title('stem(x,y,''k'')');
52.极坐标图polar
polar函数用来绘制极坐标图,其调用格式为:polar(theta,rho,选项)
例如,绘制ρ=sin(2θ)
>> theta=0:0.01:2*pi;
>> rho=sin(2*theta);
>> polar(theta,rho,'k');
53.三维绘图的基本操作
三维线图指令plot3:三维绘图指令中,plot3最易于理解,它的使用格式与plot十分相似,只是对应第三位空间的参量。
>> t=(0:0.02:2)*pi;
>> x=sin(t);
>> y=cos(t);
>> z=cos(2*t);
>> plot3(x,y,z,'b-',x,y,z,'bd');
>> view([-82,58]);
>> box on
>> legend('链','宝石')
54.三维网线图(mesh)和曲面图(surf)
画函数z=f(x,y)所代表的三维空间曲面,需要做一下的数据准备工作:
确定自变量的取值范围和取值间隔。
x=x1:dx:x2;
y=y1:dy:y2;
构成x-y平面上的自变量采样“格点”矩阵。
利用MATLAB指令meshgrid产生“格点”矩阵;
[xa,ya]=meshgrid(x,y);
计算函数在自变量采样“格点”上的函数值,即z=f(x,y)。
网线图、曲面图绘制。
例如,绘制函数z=x^2+y^2的曲面
>> x=-4:4;
>> y=x;
>> [x,y]=meshgrid(x,y);%生成x-y坐标“格点”矩阵
>> z=x.^2+y.^2;%计算格点上的函数值
>> subplot(1,2,1),mesh(x,y,z);%三维网格图
>> subplot(1,2,2),surf(x,y,z);%三维曲面图
>> colormap(hot);
55.图像文件的读写与图像显示
imread指令-读取图像文件(BMP,GIF,PNG,JPEG,andTIFF)
imshow指令-显示图像
imwrite指令-保存图像
例如,读取图像文件
>> img1=imread('shenxianyeye.jpg');
>> img2=imread('cat.tif');
>> whos img1 img2
Name Size Bytes Class Attributes
img1 768x1024x3 2359296 uint8
img2 598x1005x3 1802970 uint8
>> imshow(img1);%显示图片
简单图像处理
>> lighter=2*img1;%改变图片的亮度
>> subplot(1,2,1);
>> imshow(img1);
>> title('Original');
>> subplot(1,2,2);
>> imshow(lighter);
>> title('Lighter');
>> imwrite(lighter,'mysaved.jpg');%保存图像
>> dir mysaved.*;%查看保存结果
mysaved.jpg
>> black=rgb2gray(img1);%彩色图像转换为灰度图像
>> imshow(black);
>> zoom on%图像的缩放
56.图像特征提取
>> black=rgb2gray(img2);
>> imag_edge1=edge(black,'sobel');%sobel边缘提取算法
>> subplot(121),imshow(imag_edge1);
>> imag_edge2=edge(black,'canny');%canny边缘提取算法
>> subplot(122),imshow(imag_edge2);
>> subplot(123),imshow(imag2);
57.MATLAB命令的执行方式
交互式命令执行方式(命令窗口):逐条输入,逐条执行,操作简单、直观,但速度慢,执行过程不能保留。
M文件的程序执行方式:将命令编成程序存储在一个文件中(M文件),依次运行文件中的命令,可以重复进行。
MATLAB程序设计有传统高级语言的特征,又有自己独特的特点,可以利用数据结构的特点,使程序结构简单,编程效率高。
58.M文件的分类
用MATLAB语言编写的程序,称为M文件。是由若干MATLAB命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法。
M文件根据调用方式的不同分为两类:命令文件(Script File)、函数文件(Function File)。它们的扩展名都是.m
59.命令文件和函数文件的区别
命令文件没有输入参数,也不返回输出参数;函数文件可以带输入参数,也可以返回输出参数。
命令文件对工作空间中的变量进行操作,文件中所有命令的执行结果也返回工作空间中;函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量也被清除。
命令文件可以直接运行;函数文件不能直接运行,要以函数调用的方式来调用它。
60.顺序结构
顺序结构是指按照程序中语句的排列顺序依次执行,知道程序的最后一个语句。(最简单的一种程序)
数据的输入:从键盘输入数据,则可以使用input函数来进行,调用格式为:A=input(提示信息,选项);其中提示信息为一个字符串,用于提示用户输入数据。例如:从键盘输入A矩阵,可以采用下面的命令来完成:A=input('输入A矩阵');
数据的输出:命令窗口输出函数主要由disp函数,其调用格式为:disp(输出项)其中输出项既可以为字符串,也可以为矩阵。例如:A='Hello,Tom';disp(A)输出为:Hello,Tom。又如:A=[1,2,3;4,5,6;7,8,9];disp(A)
程序的暂停:程序执行过程中暂停,可用pause函数,其调用格式为:pause(延迟描述);如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。若要强行终止程序的运行可按Ctrl+C键。
61.选择结构
选择结构是根据给定的条件成立或不成立,分别执行不同的语句。MATLAB用于实现选择结构的语句有if语句,switch语句和try语句。
if语句:在MATLAB中,if语句有3种格式。
(1)单分支if语句
语句格式:
if条件
语句组
end
(2)双分支if语句
语句格式:
if 条件
语句组1
else
语句组2
end
(3)多分支if语句
语句格式:
if 条件1
语句组1
elseif 条件2
语句组2
...
elseif 条件m
语句组m
else
语句组n
end
switch语句:switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式:
switch 表达式
case 表达式1
语句组1
case 表达式2
语句组2
...
case 表达式m
语句组m
otherwise
语句组n
switch自居后面的表达式应为一个标量或一个字符串;case子句后面的表达式不仅可以为一个标量或一个字符串,还可以为一个元胞矩阵。
try语句:try语句是一种试探性执行语句,其语句格式为:
try
语句组1
catch
语句组2
end
try语句先试探性执行语句组1,如果在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。
例如,矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错则自动转去求两矩阵的点乘。
clc;
clear all;
A=[1,2,3;4,5,6];
B=[7,8,9;10,11,12];
try
C=A*B;
catch
C=A.*B;
end
C
lasterr%显示出错原因
62.循环结构
循环是指按照给定的条件,重复执行指定的语句,MATLAB提供了两种实现循环结构的语句:for语句和while语句。
for语句的格式为:
for循环变量=表达式1:表达式2:表达式3
循环体语句
end
其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。
例如,已知y=1/1^2+1/2^2+...+1/n^2,当n=100时,求y的值。
clear all;
clc;
y=0;
n=100;
for i=1:100
y=y+1/(i*i);
end
y
while语句的一般格式为:
while条件
循环体语句
end
其执行过程为:
若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。
例如,从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和。
clear all;
clc;
sum=0;
n=0;
x=input('请输入一个数(end in 0):');
while(x~=0)
sum=sum+x;
n=n+1;
x=input('请输入一个数(end in 0):');
end
if(n>0)
sum
mean=sum/n
end
break语句和continue语句:一般与if语句配合使用。break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
例如,求[100,200]之间第一个能被21整除的整数。
clear all;
clc;
for n=100:200
if rem(n,21)~=0;%判断n是否能被21整除
continue
end
break
end
n
63.函数文件
函数文件是另一种形式的M文件,每一个函数文件都定义一个函数。MATLAB提供的标准函数大部分是由函数文件定义的。
函数文件的基本结构:函数文件由function语句引导,其基本结构为:
function 输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
其中,以function开头的一行为引导行,表示该M文件是一个函数文件。当输出形参多余一个时,应该用方括号括起来。
64.说明
(1)关于函数文件名
函数文件名通常有函数名再加上扩展名.m组成。
当函数文件名与函数名不同时,MATLAB将忽略函数名而确认文件名,因此调用时使用函数文件名。
(2)关于注释说明部分
注释说明包括3部分:
①紧随引导行之后以%开头的第一注释行。
这一行一般包括大写的函数文件名和函数功能简要描述,供lookfor关键词查询和help在线帮助时使用。
②第一注释行及之后连续的注释行。
通常包括函数输入/输出参数的含义及调用格式说明等信息。
③与在线帮助文本相隔一空行的注释行。
包括函数文件编写和修改的信息,如作者和版本等。
(3)关于return语句
如果在函数文件中插入了return语句,则执行到该语句就结束函数的执行,流程转至调用该函数的位置。通常也不使用return语句。
例如,编写函数文件,求半径为r的圆的面积和周长。
function [s,p] = circle(r)
%CIRCLE calculate the area and perimeter of a circle of radius
% r 圆半径
% s 圆面积
% p 圆周长
%2020年12月10日编
s=pi*r*r;
p=2*pi*r;
end
65.函数调用
函数调用的一般格式是:[输出实参表]=函数名(输入实参表)
注意:函数调用时,各实参出现的顺序、个数,应与函数定义时相同。
例如,利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。
函数文件:tran.m
function [rho,theta] = tran(x,y)
rho=sqrt(x*x+y*y);
theta=atan(y/x);
end
调用函数文件的命令文件:
clear all;
clc;
x=input('please input x=');
y=input('please input y=');
[rho,the]=tran(x,y);
rho
the
66.函数的嵌套调用
在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数。一个函数调用自身称为函数的递归调用。
例如,利用函数的递归调用,求n!。
函数文件factor.m:
function f = factor(n)
%FACTOR 此处显示有关此函数的摘要
% 此处显示详细说明
if n<=1
f=1;
else
f=factor(n-1)*n;%递归调用求(n-1)!
end
在命令文件中调用该函数文件,求s=1!+2!+3!+4!+5!。main2.m
clear all;
clc;
s=0;
for i=1:5
s=s+factor(i);
end
s
67.函数参数的可调性
MATLAB在函数调用上有一个与一般高级语言不同之处:函数所传递参数数目的可调性,即参数的数量可以改变。在调用函数时,MATLAB用两个预定义变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。
例如,nargin用法示例
函数文件(examp.m):
function fout = charray(a,b,c)
if nargin==1
fout=a;
end
if nargin==2
fout=a+b;
end
if nargin==3
fout=(a*b*c)/2;
end
end
命令文件(main_examp.m):
clear all;
clc;
x=[1:3];
y=[1;2;3];
examp(x)
examp(x,y')
examp(x,y,3)
68.全局变量与局部变量
MATLAB中,函数文件中的变量是局部变量。
如在若干函数中,都把某一变量定义为全局变量,那么这些函数将共用这个变量。
全局变量的作用域是整个MATLAB的工作空间,所有函数都可以对它进行存取和修改。
全局变量用global命令定义,格式为:
global 变量名
例如,全局变量应用示例。先建立函数文件wadd.m,该函数将输入的参数加权相加:
函数文件(wadd.m)
function f = wadd(x,y)
global ALPHA BETA
f=ALPHA*x+BETA*y;
end
命令窗口输入:
>> global ALPHA BETA
>> ALPHA=1;
>> BETA=2;
>> s=wadd(1,2)
69.程序调试
程序调试时程序设计的重要环节,也是程序设计人员必须掌握的重要技能。
MATLAB提供了相应的程序调试功能,即可以通过文本编辑器对程序进行调试,又可以在命令窗口结合具体的命令进行。
(1)程序调试概述
一般来说,应用程序的错误有两类,一类是语法错误,另一类是运行时的错误。
语法错误,给出相应的错误信息,并标出错误在程序中的行号。
MATLAB对程序逻辑错误时无能为力的,不会给出任何提示信息。可以通过调试手段来发现。
采用的方法如下:
①控制单步运行
step:单步运行,不进入函数;
step in:单步运行,进入函数;
step out:停止单步运行;
save and run:存储文件并开始运行。
②断点操作
stop if error/warnings:在程序执行出现错误或警告是,停止程序运行,进入调试状态。
70.Matlab矩阵分析预处理
(1)常见的特殊矩阵有零矩阵、幺矩阵、单位矩阵等,这类特殊矩阵在应用中具有通用性。
①通用的特殊矩阵
常用的产生通用特殊矩阵的函数有:
zeros:产生全0矩阵(零矩阵)。
ones:产生全1矩阵(幺矩阵)。
eye:产生单位矩阵。
rand:产生0~1间均匀分布的随机矩阵。
randn:产生均值为0,方差为1的标准正态分布随机矩阵。
(2)建立随机矩阵
①在区间[20,50]内均匀分布的5阶随机矩阵。
②均值为0.6,方差为0.1的5阶正态分布随机矩阵。
命令如下:
x=20+(50-20)*rand(5)
71.矩阵结构变换
(1)对角阵与三角阵
只有对角线上的非零元素的矩阵称为对角矩阵,在研究矩阵时,有时候需要将矩阵的对角线上的元素提取出来形成一个列向量,有时也需要用一个向量构造一个对角阵。
①提取矩阵的对角线元素函数:diag
例如:
A=[1,2,3;4,5,6];
D=diag(A)
D=
1
5
diag函数还有一种形式:diag(A,k)提取第k条对角线的元素。
例如:
D1=diag(A,1)
D1=
2
6
(2)构造对角矩阵
如果V是一个m个元素的向量,diag(V)将产生一个m*m对角矩阵,其主对角线元素即为向量V的元素。
例如:
>> diag([1,2,-1,4])
ans =
1 0 0 0
0 2 0 0
0 0 -1 0
0 0 0 4
>> diag(1:3,-1)
ans =
0 0 0 0
1 0 0 0
0 2 0 0
0 0 3 0
例如:
建立一个5*5矩阵A,然后将A的第一行元素乘以1,第二行乘以2,...第五行乘以5。
解:
用一个对角矩阵左乘一个矩阵时,相当于用对角阵的第一个元素乘以该矩阵的第一行,依次类推。
命令如下:
>> A=ones(5);
>> D=diag(1:5);
>> D*A
ans =
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
72.矩阵求逆与线性方程组求解
(1)矩阵的逆
对于一个方阵A,如果存在一个与其同阶的方阵B,使得:A*B=B*A=I(I为单位矩阵)则称B为A的逆矩阵,当然,A也是B的逆矩阵。求方阵A的逆矩阵可调用函数inv(A)。
例如:求方阵A的逆矩阵,且验证。
>> A=[1,-1,1;5,-4,3;2,1,1];
>> B=inv(A);
>> A*B
ans =
1.0000 0.0000 0.0000
-0.0000 1.0000 0.0000
-0.0000 0.0000 1.0000
(2)用矩阵求逆方法求解线性方程组
例如,用求逆矩阵A的方法解线性方程组
x+2y+3z=5
x+4y+9z=-2
x+8y+27z=6
>> A=[1,2,3;1,4,9;1,8,27];
>> b=[5,-2,6]';
>> x=inv(A)*b %x=A\b
x =
23.0000
-14.5000
3.6667
也可用左除运算符求解。
73.矩阵行列式值
把一个方程看做一个行列式,并按行列式的规则求值,称为行列式的值。在MATLAB中,使用函数det(A)得到。
例如:
>> A=rand(5)
A =
0.2760 0.4984 0.7513 0.9593 0.8407
0.6797 0.9597 0.2551 0.5472 0.2543
0.6551 0.3404 0.5060 0.1386 0.8143
0.1626 0.5853 0.6991 0.1493 0.2435
0.1190 0.2238 0.8909 0.2575 0.9293
>> B=det(A)
B =
0.0538
74.多项式的MATLAB表达
(1)多项式有一个行向量表示,该向量元素是该多项式的系数,且按降幂次序排列。
例如,多项式x^4-12x^3+25x+116由行向量:p=[1 -12 0 25 116]表示。
注意,必须包括具有零函数的项。求解多项式的根:roots指令。
例如,求解多项式x^4-12x^3+25x+116的根
>> p=[1 -12 0 25 116]
p =
1 -12 0 25 116
>> r=roots(p)
r =
11.7473 + 0.0000i
2.7028 + 0.0000i
-1.2251 + 1.4672i
-1.2251 - 1.4672i
MATLAB按惯例规定,多项式是行向量,根是列向量。
(2)已知多项式的根,求解多项式,用poly指令。
>> r=roots(p)
r =
11.7473 + 0.0000i
2.7028 + 0.0000i
-1.2251 + 1.4672i
-1.2251 - 1.4672i
>> pp=poly(r)
pp =
1.0000 -12.0000 -0.0000 25.0000 116.0000
(3)多项式的乘法(conv指令)
例如,多项式a(x)=x^3+2x^2+3x+4和b(x)=x^3+4x^2+9x+16的乘积。
>> a=[1 2 3 4];b=[1 4 9 16];
>> c=conv(a,b)
c =
1 6 20 50 75 84 64
两个以上的多项式的乘法需要重复使用conv。
(4)多项式加法
MATLAB没有提供进行假发运算的函数,如果两个多项式向量大小相同,标准的数组加法有效。把多项式a(x)与上面给出的b(x)相加。
>> a=[1 2 3 4];b=[1 4 9 16];
>> d=a+b
d =
2 6 12 20
当两个多项式阶次不同,低阶的多项式必须用首零填补,使其与高阶多项式有同样的阶次。
考虑上面多项式c和d相加:
>> c=conv(a,b)
c =
1 6 20 50 75 84 64
>> e=c+[0 0 0 d]
e =
1 6 20 52 81 96 84
例如,编写一个多项式加法运算的函数文件
明确需求:定义一个函数,需要有两个输入参数(比如:p1、p2),一个输出参数p_out。
p1、p2表示两个待计算的多项式;
p_out表示两个多项式的求和结果。
函数的内部处理
如p1、p2两个参数大小相等,则直接相加:p_out=p1+p2
如p1、p2两个参数大小不等:
if length(p1)>length (p2)
p2前面要补0元素,使p1、p2两参数大小相等
否则
p1前面要补0元素,使p1、p2两参数大小相等
function p_out = poly_sum(p1,p2)
%计算两个多项式的和
if length(p1)==length(p2)
p_out=p1+p2;
elseif length(p1)>length(p2)
p2=[zeros(1,length(p1)-length(p2)),p2];
p_out=p1+p2;
else
p1=[zeros(1,length(p2)-length(p1)),p1];
p_out=p1+p2;
end
>> poly(c,d)
ans =
1 6 20 52 81 96 84
(5)多项式的除法(deconv)
举例说明:
c(x)=x^6+6x^5+20x^4+50x^3+75x^2+84x+64除以b(x)=x^3+4x^2+9x+16
>> c=[1 6 20 50 75 84 64];
>> b=[1 4 9 16];
>> [q,r]=deconv(c,b)
q =
1 2 3 4
r =
0 0 0 0 0 0 0
(6)多项式的导数(polyder)
举例:求b(x)=x^3+4x^2+9x=16的导数。
>> b=[1 4 9 16];
>> d=polyder(b)
d =
3 8 9
另外两种形式为:
p=polyder(P,Q):求P*Q的导函数
[p,q]=polyder(P,Q):求P/Q的导函数,导数分子存入p,导数分母存入q。
(7)多项式的估值(polyval)
举例:绘制p(x)=x^3+4x^2-7x-10在[-1,3]段上的曲线。
>> x=linspace(-1,3);
>> p=[1 4 -7 -10];
>> v=polyval(p,x);
>> plot(x,v);
>> title('x^{3}+4x^{2}-7x-10');
>> xlabel('x')
75.函数的数值导数
MATLAB中没有直接提供数值导数的函数,只有计算向前差分的函数diff,其调用格式为:
DX=diff(X)计算向量X的向前差分
DX=diff(X,n)计算向量X的n阶向前差分
例如,设x由[0,2n]间均匀分布的10个点组成,求sinx的1-3阶差分。命令如下:
>> X=linspace(0,2*pi,10);
>> Y=sin(X);
>> DY=diff(Y)
DY =
Columns 1 through 5
0.6428 0.3420 -0.1188 -0.5240 -0.6840
Columns 6 through 9
-0.5240 -0.1188 0.3420 0.6428
>> D2Y=diff(Y,2)
D2Y =
Columns 1 through 5
-0.3008 -0.4608 -0.4052 -0.1600 0.1600
Columns 6 through 8
0.4052 0.4608 0.3008
>> D3Y=diff(Y,3)
D3Y =
Columns 1 through 5
-0.1600 0.0556 0.2452 0.3201 0.2452
Columns 6 through 7
0.0556 -0.1600
例如,设f(x)=根号(x^3+2x^2-x+12)+根号^6(x+5)+5x+2,在[-3,3]区间内以0.01为步长求数值导数。并画出导函数图像。程序如下:
>> f=inline('sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2');
>> x=-3:0.01:3;
>> dx=diff(f([x,3.01]))/0.01;
>> plot(x,dx)
76.数值积分
一元函数的数值积分
常用积分指令:quad和quadl。一般说来,quadl比quad更有效。
具体调用格式如下:
q=quadl(fun,a,b)
q=quadl(fun,a,b,tol)
q=quadl(fun,a,b,tol,trace)
[q,fcnt]=quadl(fun,a,b,...)
输入量fun为被积函数的句柄。
输入量a,b分别是积分的下限和上限,都必须是确定的 数值;
前3个输入参数是调用积分指令所必须的,其他可以缺省;
输入量tol是一个标量,控制绝对误差;
输入量trace为非0值时,将随积分的进程逐点画出被积分函数;
输出参数fcnt返回函数的执行次数。
Note:quad的调用格式与quadl相同。
举例:求定积分I=∫(0->1)e^(-x^2)dx
MATLAB指令quad和quadl求积分
>> fun=inline('exp(-x.*x)','x');%数组乘符号.*的采用是必须的
>> Isim=quad(fun,0,1),I8=quadl(fun,0,1)
Isim =
0.7468
I8 =
0.7468
举例:求解定积分I=∫(0->1)根号ln(1/x)dx
用quad指令求积分
>> ff=inline('sqrt(log(1./x))','x');
>> Isim=quad(ff,0,1)
Isim =
0.8862
77.元素排序
MATLAB中对向量X排序的函数是sort(X),函数返回一个对X中的元素按升序排列的新向量。sort函数也可以对矩阵A的各列(或行)重新排序,其调用格式为:
[Y,I]=sort(A,dim)
dim=1,按列排序;dim=2,按行排序,Y是排序后的矩阵,I记录Y中的元素在A中的位置。
例如,对下列矩阵做各种排序。
A=[1,-8,5;4,12,6;13,7,-13]
>> A=[1,-8,5;4,12,6;13,7,-13];
>> sort(A)
ans =
1 -8 -13
4 7 5
13 12 6
>> sort(-A,2)%对A的每行按降序排列
ans =
-5 -1 8
-12 -6 -4
-13 -7 13
78.数据插值
在工程测量和科学实验中,所得到的的数据通常是离散的,要得到这些离散点以外的其他店的数值,就需要根据已知的数据进行插值。插值函数一般由线性函数、多项式、样条函数或这些函数的分段函数充当。
一维数据插值:被插值函数有一个单变量。
才用的方法有:线性方法、最近方法、三次样条和三次插值。在MATLAB中实现这些插值的函数是interp1,其调用格式如下:
Y1=interp1(X,Y,X1,method)
(1)'linear':线性插值。默认的插值方式。它是把插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。
(2)'nearest':最近点插值。根据已知插值点与已知数据点的远近程度进行插值。插值点优先选择较近的数据点进行插值。
(3)'pchip':3次多项式插值。根据已知数据求出一个3次多项式,然后根据该多项式进行插值。
(4)'spline':3次样条插值。指在每个分段内构造一个3次多项式,使其满足插值条件外,在个节点处具有光滑的条件。
例:给出概率积分数据表如下,用不同的插值方法计算f(0.472)。
x 0.46 0.47 0.48 0.49
f(x) 0.4846555 0.4937542 0.5027498 0.5116683
>> x=0.46:0.01:0.49;
>> f=[0.4846555,0.4937542,0.5027498,0.5116683];
>> format long
>> interp1(x,f,0.472)
ans =
0.495553320000000
>> interp1(x,f,0.472,'nearest')
ans =
0.493754200000000
>> interp1(x,f,0.472,'spline')
ans =
0.495560736000000
>> interp1(x,f,0.472,'pchip')
ans =
0.495561119712056
79.曲线拟合
数值插值要求逼近函数在采样点与被逼近函数相等,但由于测量误差,所获得的数据不一定准确,如果强求逼近显然不够合理。曲线拟合不要求逼近函数通过各采样点,但要尽量的接近这些点,是误差在某种意义上达到最小。
曲线拟合的实现:
在MATLAB中,用ployfit函数来求得最小二乘拟合多项式的系数,再用polyval函数按所得的多项式计算所给出点上的函数近似值。
polyfit函数的调用格式为:
[P,S]=polyfit(X,Y,m)
例:用一个三次多项式在区间[0,2n]内逼近函数sinx。
在给定的区间内,均匀的选择20个采样点,并计算采样点的函数值,然后利用3次多项式逼近。
命令如下:
>> x=linspace(0,2*pi,20);
>> y=sin(x);
>> p=polyfit(x,y,3)
p =
Columns 1 through 2
0.088357278851222 -0.832747734390553
Columns 3 through 4
1.780900319878795 -0.115602892148138
>> y1=polyval(p,x)
y1 =
Columns 1 through 2
-0.115602892148138 0.385457422110637
Columns 3 through 4
0.723553873446247 0.917858681026122
Columns 5 through 6
0.987544064017693 0.951782241588392
Columns 7 through 8
0.829745432905651 0.640605857136901
Columns 9 through 10
0.403535733449572 0.137707281011097
Columns 11 through 12
-0.137707281011096 -0.403535733449570
Columns 13 through 14
-0.640605857136898 -0.829745432905648
Columns 15 through 16
-0.951782241588388 -0.987544064017687
Columns 17 through 18
-0.917858681026114 -0.723553873446236
Columns 19 through 20
-0.385457422110625 0.115602892148153
>> plot(x,y,':o',x,y1,'-*')
>> legend('sin(x)','fit')