MATLAB习题与实验.docx
《MATLAB习题与实验.docx》由会员分享,可在线阅读,更多相关《MATLAB习题与实验.docx(18页珍藏版)》请在冰豆网上搜索。
MATLAB习题与实验
MATLAB习题与实验
实验一:
变量和矩阵的赋值、矩阵的初等运算
实验目的:
1.熟悉MATLAB的工作环境
2.掌握变量的赋值、矩阵的创建。
3.掌握矩阵和数组的初等运算。
4.熟悉和掌握inv、mean、var、randn、rand、ones、zeros、magic、eye函数的使用。
实验内容:
1.菜单栏File→Preferences→CommandWindow→FontandColors修改字体,选择Usecustomfont改为24。
同样方法File→Preferences→Editor/Debugger→FontandColors修改字体,选择Usecustomfont改为24。
点击Apply,OK即可。
2.在内产生均匀分布的200个点,形成1×200向量赋给变量X。
(结果不必记录)
X=linspace(0,2*pi,200);
3.在内每间隔3产生向量Y。
Y=[0:
3:
10];
4.给矩阵赋值,,打开workspace查看矩阵的赋值。
使用savedataAB语句存储到data.mat数据文件中。
输入Clearall命令清空所有变量,再使用loaddata加载矩阵A和B。
A=[14813;-36-5-9;2-7-1218];
B=[543-2;6-23-8;-13-97];
savedataAB;
clearall;
loaddata;
5.产生8*6阶的正态分布随机数矩阵R,求其各列的平均值和方差,并求全体的平均值和方差。
R=randn(8,6);
a=mean(R);
b=var(R);
c=mean(R(:
));
d=var(R(:
));
6.模拟选号程序,现有10000人,按顺序编号为1,2,…10000号,一次随机选出一个编号,要求随机数均匀分布。
R=round(ceil(rand(10000,1)*10000));
7.产生4*6阶的均匀分布随机数矩阵R,要求其元素在1~16之间取整数值,并求此矩阵前四列组成的方阵的逆阵。
R=round(ceil(rand(4,6)*16));
R=(:
[5,6])=[];
inv(R);
8.使用矩阵运算产生99乘法表,显示数值即可。
R=[1:
1:
9];
R'*R;
9.求下列联立方程的解:
A=[3,4,-7,-12;5,-7,4,2;1,0,8,-5;-6,5,-2,10];
B=[4;-3;9;-8];
X=A\B;
9.(选做)
产生1~100之间的奇数,按降序排列,赋给Z。
(结果不必记录)
Z=[99:
-2:
1];
10.将1~1000之间尾数为3的数取出,赋给M。
(结果不必记录)
R=[1:
1:
1000];
M=R(rem(R,10)==3);
11.(选做)
a)列出2*2阶的单位矩阵I,4*4阶的魔方矩阵M和4*2阶的全幺矩阵A,全零矩阵B。
I=eye
(2);
M=magic(4);
A=ones(4,2);
B=zeros(4,2);
b)将这些矩阵拼接为6*6阶的矩阵C:
C=[I,A';B,M];
c)取出C的第2、4、6行,组成3*6阶的矩阵,取出C的第2、4、6列,组成6*3阶的矩阵。
C1=C([2,4,6],:
);
C2=C(:
[2,4,6]);
d)求和
D=C1*C2;
D=C2*C1;
实验要求:
记录命令代码或函数代码和输出结果,有图形输出
实验二:
逻辑判断与流程控制
实验目的:
1.掌握常用关系运算和逻辑运算。
2.熟悉掌握选择结构(if语句)、循环结构(for语句,while语句)、多路分支结构(switch语句)的流程控制语句。
3.学习编写脚本文件(*.m文件)。
掌握脚本文件的调用方法。
实验内容:
1.找出1~100间3的倍数和尾数是3的数,按升序排列。
提示:
排序函数为sort(X)
程序源代码和调用及结果:
X=1:
100;
Y=[X(rem(X,3)==0)X(rem(X,10)==3)];
Z=sort(Y);
fork=1:
length(Z)
if(k+1)>length(Z) break, end
ifZ(k)==Z(k+1) Z(k)=[];end
end
disp(Z)
Columns1through15
3 6 9 12 13 15 18 21 23 24 27 30 33 36 39
Columns16through30
42 43 45 48 51 53 54 57 60 63 66 69 72 73 75
Columns31through39
78 81 83 84 87 90 93 96 99
2.编写脚本文件exe31.m使用选择结构编写程序判断输入的成绩C为及格、中等、良好、优秀、满分还是不及格。
该脚本文件的第一行是:
C=input('请输入成绩C= ');
程序源代码和调用及结果:
C=input('请输入成绩C= ')
ifC<0|C>100'error',
elseifC==100'满分',
elseifC<100&C>=90'优秀',
elseifC>=80&C<90'良好',
elseifC>=70&C<80'中等',
elseifC>=60&C<70'及格',
else'不及格',
end
请输入成绩C= 67
C=
67
ans=
及格
3.编写脚本文件exe32.m使用for循环计算1~1000的累加和。
程序源代码和调用及结果
S=0;
forx=1:
1000
S=S+x;
end
S
S=
思考:
不使用循环,求解上题。
(使用sum函数)
4.编写脚本文件exe33.m使用while循环计算从1开始的奇数的联乘积S1,S1=1×3×5×…。
要求S1<1×106,显示S1和最后一个奇数的值。
程序源代码和调用及结果
n=1;
s=1;
whiles<10^6
S1=s;
s=s*(n+2);
n=n+2;
end,
S1,n-2
S1=
ans=
13
5.(选做)编写脚本文件exe34.m使用switch语句改写exe31.m,完成相同功能。
程序源代码和调用及结果
C=input('请输入成绩C= ')
ifC<0|C>100'error',
elseswitchfix(C/10),
case10,'满分',
case9,'优秀',
case8,'良好',
case7,'中等',
case6,'及格',
otherwise'不及格',
end
end
请输入成绩C= 67
C=
67
ans=
及格
6.(选做)假设一个人从第1年到第N=10年每年投入本金S=10000元,每年利率为q=10%,编写循环求到第N+1年本利合计T,与本金总额S*N比较。
(本题应先作出数学模型再编程)
程序源代码和调用及结果
S=10000;S1=10000;N=10;q=0.1;
fori=1:
N;
S2=S1*(1+q);S1=S2+10000;T=S2;
end
T
S*N
T=
1.7531e+005
ans=
要求:
记录程序源代码和调用及结果。
实验三:
直角坐标系和极坐标系下基本2-D图形的绘制
实验目的:
1.掌握用linspace函数和初值:
步长:
终值生成向量。
2.熟悉使用plot在直角坐标系下绘制2-D图形。
3.掌握用subplot函数绘制子图图形,使用xlabel、ylabel和title函数进行标注。
4.掌握使用polar在极坐标系下绘制函数图形。
5.使用plot3在直角坐标系下绘制3-D图形。
实验内容:
1.设,把间分为101点,画出以x为横坐标,y为纵坐标的曲线。
x=linspace(0,2*pi,101);
y=cos(x).*(0.5+3*sin(x)./(1+x.^2));
plot(x,y);
2.分别令r=2、3、4,用subplot画出参数t=0~10区间每隔0.1生成x~y曲线。
t=0:
0.1:
10;
forr=2:
4;
x=r*cos(t)+3*t;
y=r*sin(t)+3;
subplot(1,3,r-1);
plot(x,y);
end
3.设,
a)若=0.5,令N=1,2,3,4,使用循环语句在4个2*2子图中分别画出其曲线,横轴标注N的取值。
a=0.5;t=0:
0.1:
10;
forN=1:
4
x=sin(t);
y=sin(N*t+a);
subplot(2,2,N);
plot(x,y);
xlabel(N);
end
b)若N=2,取,使用循环语句在4个2*2子图中分别画出其曲线,横轴标注的取值。
N=2;t=0:
0.1:
10;
a=[0,pi/3,pi/2,pi];
form=1:
4
x=sin(t);
y=sin(N*t+a(m));
subplot(2,2,m);
plot(x,y);
xlabel(a(m));
end
4.(选做)以下给出双曲螺线、三叶玫瑰线、箕舌线和双曲线的方程,在4个2*2子图中分别画出其曲线,横轴分别标注“双曲螺线”,“三叶玫瑰线”,“箕舌线”,“双曲线”。
保存为curve.m文件。
双曲螺线,三叶玫瑰线,箕舌线,双曲线
其中a=2,b=3,
a=2;b=3;
theta=0:
0.01:
2*pi;
r=a./theta;
subplot(2,2,1);
polar(theta,r);
xlabel('双曲螺线');
r=a.*cos(3*theta);
subplot(2,2,2);
polar(theta,r);
xlabel('三叶玫瑰线');
x=-5:
0.1:
5;
y=8*a^3./(x.^2+4*a^2);
subplot(2,2,3);
plot(x,y);
xlabel('箕舌线');
y=-5:
0.01:
5;
x=sqrt(a^2/b^2+a^2*y.^2./b^2);
subplot(2,2,4);
plot(x,y,-x,y,'b');
xlabel('双曲线');
5.(选做)
a)已知椭球面的曲面方程为,其中a=4,b=3,c=1.5用plot3函数作3-D图。
a=4;b=3;c=1.5;
x=-10:
0.1:
10;
y=x';
[X,Y]=meshgrid(x,y);
Z=sqrt(c^2-c^2.*X.^2./a^2-c^2.*Y.^2./b^2);
plot3(X,Y,Z,X,Y,-Z)
b)已知鞍形曲面的方程为,其中p=4,q=3用mesh函数作3-D图。
p=4;q=3;
[x,y]=meshgrid(-10:
0.2:
10,-10:
0.2:
10);
z=-x.^2/2*p+y.^2/2*q;
mesh(x,y,z);
c)保存为pict3d.m。
实验要求:
记录命令代码或函数代码和输出结果,有图形输出的要绘图。
实验四:
matlab应用于数字图像增强和滤波
实验目的:
1.熟悉灰度图像读入函数imread和图像显示函数imshow。
2.掌握数据类型强制转换函数y=double(x)。
(注意进行运算前类型为uint8的数据必须转换为double类型)。
3.掌握使用函数映射增强图像的方法。
4.熟悉使用imhist函数显示图像直方图。
5.熟悉使用histeq函数进行直方图均衡化,通过实验结果理解直方图均衡化的作用。
6.掌握加噪函数imnoise函数。
7.熟悉常用空域平滑滤波和锐化滤波模板,如下:
平滑滤波模板 ,
锐化滤波模板
8.掌握空域滤波2-D卷积函数y=conv2(x,d,’same’)的调用。
其中x为原始图像,y为滤波后图像,d为滤波模板。
9.(选做)熟悉切贝雪夫I型滤波器设计函数cheby1,滤波网络频率特性函数freqz和二维滤波filter2函数。
实验内容:
1.根据简单的函数映射规则编写程序experiment.m,完成图像求反、增强对比度、降低对比度。
(1).在MATLAB中读入名为lena.bmp的图像给矩阵X,将X强制类型转换为double。
(2).对原始图像求反,即黑色?
?
白色,形成底片效果,结果赋值给矩阵X1。
要求原图像灰度范围0~255,求反后灰度变化范围255~0。
(3).对原始图像X降低对比度,结果赋值给矩阵X2。
(提示:
使用一次直线映射)
要求原图像灰度范围0~255,降低对比度后灰度变化范围0~127。
(4).对降低对比度后的图像X2增强对比度(提示:
使用指数函数映射),结果赋值给矩阵X3,要求与原始图像外观类似。
(5).在figureNo.1显示原图像、求反图像、增强对比度图像和降低对比度图像的图像与直方图,并添加标注说明。
(6).对降低对比度后图像矩阵X2使用histeq函数进行直方图均衡化,结果赋值给矩阵X4。
在figureNo.2显示降低对比度后图像与直方图均衡化后图像,并添加标注说明。
x=imread('lena.bmp');
x=double(x)/255;
x1=1-x;
x2=(floor(x*255/2)/255);
x3=(exp(x2*255/10))/255;
figure,subplot(4,2,1),imshow(x)
title('原图像');
subplot(4,2,2),imhist(x);
title('原图像直方图');
subplot(4,2,3),imshow(x1);
title('求反图像');
subplot(4,2,4),imhist(x1);
title('求反图像直方图');
subplot(4,2,5),imshow(x2);
title('增强对比度图像');
subplot(4,2,6),imhist(x2);
title('增强对比度图像直方图');
subplot(4,2,7),imshow(x3);
title('降低对比度图像');
subplot(4,2,8),imhist(x3);
title('降低对比度图像直方图');
figure,subplot(1,2,1),imshow(x2);
title('降低对比度图像');
subplot(1,2,2),imshow(x4);
title('直方图均衡化图像');
2.以下将所有代码写成名为imfil.m的脚本文件,存盘。
在commandwindow中运行。
(1).在MATLAB中读入名为eight.tif的图像给矩阵X,将X强制类型转换为double,最大值归一化并显示X。
(2).使用imnoise函数对图像矩阵X加噪,加噪后图像矩阵名为J。
要求噪声为零均值,方差0.005的高斯噪声。
(3).使用以上给出的平滑滤波模板和conv2函数对加噪图像进行平滑滤波即降噪,输出图像Y1并显示。
(4).使用以上给出的锐化滤波模板和conv2函数对图像X进行锐化滤波即边缘增强,输出图像Y2并显示。
(5).在一个图形窗口中建立2×2子窗口,分别显示原始图像X,加噪图像J,降噪后图像Y1和边缘增强图像Y2。
X=imread('eight.tif');
Y=double(X);
x=(255-Y)./255;
J=imnoise(x,'gaussian',0,0.005);
d1=0.1.*[1,1,1;1,2,1;1,1,1];
Y1=conv2(J,d1,'same');
d2=[0,-1,0;-1,5,-1;0,-1,0];
Y2=conv2(Y,d2,'same');
subplot(2,2,1),imshow(X);title('原图象');
subplot(2,2,2),imshow(J);title('加噪图象');
subplot(2,2,3),imshow(Y1);title('降噪后图象');
subplot(2,2,4),imshow(Y2/max(max(Y2))+Y/255);title('边缘增强图象');
3.(选做)编写程序specfil.m,完成理想滤波器对一幅图像的低通、高通滤波,比较并分析结果。
(1).在MATLAB中读入名为lena.bmp的图像给矩阵X,将X强制类型转换为double。
(2).用cheby1分别设计低通和高通滤波器并对原始图像X进行滤波,低通滤波后图像为X1,高通滤波后图像为X2。
(3).在FigureNO1中开设1*3个子窗口显示原始图像X、低通滤波后图像X1和高通滤波后图像X2。
4.(选做)编写函数[f2,f3]=photo(ut),图像文件名为lena256.bmp,第ut行为破损行,即令该行值全为255,文件存为lena2.bmp,编写程序进行预测修补,文件保存为lena3.bmp。
其中图像文件读入函数为imread,写出函数为imwrite,无符号8位整型数转换为双精度类型函数为double,其逆运算函数为uint8。
实验要求:
记录命令代码或函数代码和输出结果,实验三依次输入ut=1,ut=110和ut=256进行测试。
实验五:
函数编写与程序调试
实验目的:
1.掌握函数的编写[y1,y2…]=functionname(x1,x2,…),明确输入变量与输出变量,掌握函数的调用。
2.熟悉使用if…end中插入error,break终止循环。
3.熟悉掌握使用设置断点的方法进行程序调试。
实验内容:
1.设,写出一个MATLAB函数程序f31.m,使得调用f31时,x可用矩阵代入,得出的f(x)为同阶矩阵。
画出x=[0,4]区间内的f31曲线。
(P874.19)
functiony=f31(x)
y=1./((x-2).^2+0.1)+1./((x-3).^4+0.01);
plot(x,y);
2.寻找Fibonacc数组中大于N的元素T并显示从1开始截止到N的全部数组S,Fibonacc数组如下:
{11235813213455……}。
方法一.编写function[S,T]=findfib(N)函数文件,使用while循环。
function[S,T]=findfib(N)
S=[1,1];i=1;
whileS(i)+S(i+1) S(i+2)=S(i+1)+S(i);
i=i+1;
end
T=S(i+1)+S(i);
输出结果:
[S,T]=findfib(100)
S=
1 1 2 3 5 8 13 21 34 55 89
T=
144
方法二.编写function[S,T]=findfib1(N)函数文件,使用for循环,用if条件语句找到符合条件的元素使用break并退出循环。
function[S,T]=findfib1(N)
f=[1,1];
form=1:
1000
f(m+2)=f(m+1)+f(m);
iff(m+2)>N;
break;
end
end
T=f(m+2);
f(m+2)=[];
S=f;
输出结果:
[S,T]=findfib1(100)
S=
1 1 2 3 5 8 13 21 34 55 89
T=
144
3.使用两种方法根据模型画出一组椭圆,其中a为0.5~4.5间隔0.25的一组数,要求横轴标注’X’,纵轴标注’Y’,图形标题标注’一组a=0.5~4.5的椭圆’。
方法一.使用for循环做出exp1.m文件。
clearall;closeall;
fora=0.5:
0.25:
4.5;
thita=0:
0.01:
2*pi;
x=a.*cos(thita);
y=sqrt(25-a.^2).*sin(thita);
plot(x,y);
axis('equal');
gridon;
holdon;
title('一组a=0.5~4.5的椭圆');
xlabel('X');
ylabel('Y');
end
方法二.不使用for循环,编写函数function[x,y]=exp2(a),在commandwindow中给a赋值,调用exp2函数作图。
function[x,y]=exp2(a)
thita=0:
0.01:
2*pi;
x=cos(thita')*a;
y=sin(thita')*sqrt(25-a.^2);
plot(x,y,'b-');
axis('equal');
gridon;
holdon;
title('一组a=0.5~4.5的椭圆');
xlabel('X');
ylabel('Y');
比较两种方法。
提示:
使用下列一段程序可以画单位圆。
clearall;closeall;
thita=0:
0.01:
2*pi;R=1;
x=R*cos(thita);y=R*sin(thita)