第一篇:matlab实践报告
MATLAB 实践 课程设计
学生姓名:
学
号:
专业班级:
指导教师:
二○一二
年
六 月 二十 日1
《》
目录
1.设计目的„„„„„„„„„„„„„„„„„„„3 2.题目分析„„„„„„„„„„„„„„„„„„„3 3.总体设计„„„„„„„„„„„„„„„„„„„3 4.具体设计„„„„„„„„„„„„„„„„„„„4 5.结果分析„„„„„„„„„„„„„„„„„„„32 6.心得体会„„„„„„„„„„„„„„„„„„„33 6.附录代码„„„„„„„„„„„„„„„„„„„35
1、设计目的
综合运用MATLAB工具箱实现图像处理的GUI程序设计。
2、题目分析
1.课程设计的基本要求
1)熟悉和掌握MATLAB 程序设计方法 2)掌握MATLAB GUI 程序设计 3)学习和熟悉MATLAB图像处理工具箱
4)学会运用MATLAB工具箱对图像进行处理和分析 2. 课程设计的内容
学习MATLAB GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop。要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。
1)图像的读取和保存。
2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。
3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。
4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。
5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。
6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。7)设计图形用户界面,让用户能够对图像进行伪彩色和真彩色处理。8)能够对图像进行一些特效处理,如底片,浮雕,倒影等
3、总体设计
这次的设计的功能按钮主要是菜单部分,菜单功能上的伪彩色、真彩色增强和各种特效算是比较有特色的地方,其他的功能是一些图像处理的基本实现大多可以通过Matlab自带的一些现成函数来调用以实现,关键是要注意它的使用语法和支持的图像类型。
具体的菜单功能和面板设计如下图所示:
4、具体设计 4.1 菜单的设计 通过Menu Editor创建如下菜单
4.2 图像的读取和保存
1)利用matlab中 “ uigetfile”、“imread” “imshow”实现图像文件的读取与显示:
[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像');if isequal(filename,0)lisequal(pathname,0)errordlg('没有选中文件','出错');return;else
file=[pathname,filename];global S %设置一个全局变量S,保存初始图像路径,以便之后的还原操作
S=file;x=imread(file);set(handles.axes1,'HandleVisibility','ON');axes(handles.axes1);imshow(x);set(handles.axes1,'HandleVisibility','OFF');axes(handles.axes2);imshow(x);handles.img=x;guidata(hObject,handles);End 程序关键部分:
通过[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像')选择相应路径打开的图像;通过file=[pathname,filename];x=imread(file);读取选中的图像;最后,通过imshow(x)在显示区域上显示图像。2)
利用“uiputfile”、“imwrite”函数实现图像文件的保存。
[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');if ~isequal([sfilename,sfilepath],[0,0])sfilefullname=[sfilepath ,sfilename];imwrite(handles.img,sfilefullname);else
msgbox('你按了取消键','保存失败');end
程序关键部分:
通[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg')选择图像文件保存的路径与格式;然后,通过sfilefullname=[sfilepath ,sfilename];imwrite(handles.img,sfilefullname);实现对图像的保存。3)程序的退出 clc;close all;close(gcf);clear;4.3 对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。1)亮度调节
%亮度调节
axes(handles.axes2);prompt={'调整倍数'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});y=imadjust(handles.img,[ ], [ ],p1);%亮度调节
imshow(y);handles.img=y;guidata(hObject,handles);
2)对比度调节 %对比度调节
axes(handles.axes2);prompt={'调整倍数'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});7
y=immultiply(handles.img,p1);%对比度调节
imshow(y);handles.img=y;guidata(hObject,handles);
4.4 用鼠标选取图像感兴趣区域,显示和保存该选择区域。
通过imcrop(x)函数来实现对图片某一区域的截取,截取的图片在右框中显示。结合“保存为„”,可把截图处理后的图片保存在指定路径。%截图 global T axes(handles.axes2);T=getimage;x=imcrop(handles.img);%截图 imshow(x);handles.img=x;guidata(hObject,handles);
4.5 图像转化为灰度图像。
利用rgb2gray(X)函数对其他图像进行灰度图像的转化。%灰度变换 global T axes(handles.axes2);T=getimage;x=rgb2gray(handles.img);%灰度变换
imshow(x);handles.img=x;
guidata(hObject,handles);
4.6对图像进行放大和缩小整数倍的操作。
通过imresize(X,n,mode)函数对图像X进行放大或者缩小。N放大缩小倍数,mode为采用的方式,通过处理后可发现保存的图片的比原图放大了(缩小了)。1)放大
%最近邻插值法放大
global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'nearest');%最近邻插值法放大 imshow(y);handles.img=y;guidata(hObject,handles);%双线性插值法放大 global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%双线性插值法放大 imshow(y);handles.img=y;guidata(hObject,handles);
2)缩小
%最近邻插值法缩小 global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'nearest');%最近邻插值法缩小 imshow(y);handles.img=y;guidata(hObject,handles);%双线性插值法缩小 global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%双线性插值法缩小 imshow(y);handles.img=y;guidata(hObject,handles);4.7图像直方图统计和直方图均衡。(1)通过imhist函数实现直方图统计。
由于imhist函数只能对灰度图像进行直方图统计,所以要先判断图像是彩色图像还是灰度图像,分两种情况处理。global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%对灰度图像和彩色图像分别处理 for k=1:3 x(:,:,k)=imhist(s(:,:,k));%直方图统计
end else
x=imhist(handles.img);%直方图统计 end
x1=x(1:10:256);horz=1:10:256;bar(horz,x1);axis([0 255 0 15000]);set(handles.axes2,'xtick',0:50:255);set(handles.axes2,'ytick',0:2000:15000);
(2)通过histeq(X)函数实现直方图均衡。
因为此函数只能对灰度图像进行直方图均衡故应先将彩图转为灰度图像所以要先判断图像是彩色图像还是灰度图像,分两种情况处理。%直方图均衡化 global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%对灰度图像和彩色图像分别处理 a=histeq(s(:,:,1));%对每一种基色直方图均衡 b=histeq(s(:,:,2));c=histeq(s(:,:,3));k(:,:,1)=a;
k(:,:,2)=b;k(:,:,3)=c;imshow(k);else
y=histeq(s);%对灰度图像直方图均衡
imshow(y);handles.img=y;guidata(hObject,handles);end
4.8撤销和还原
1)撤销上一步的操作,通过设一个全局变量T保存是上一次操作后的图像。%撤销
axes(handles.axes2);global T imshow(T);handles.img=T;guidata(hObject,handles);2)通过一个全局变量保存原始图像路径,在需要还原至原始图像时,重新读取该全局变量即可。%还原
global S axes(handles.axes2);y=imread(S);
f=imshow(y);handles.img=y;guidata(hObject,handles);4.9边缘采集 %边缘采集 global T axes(handles.axes2);T=getimage;s=handles.img;if isrgb(s)%对灰度图像和彩色图像分别处理 for k=1:3 f(:,:,k)=edge(s(:,:,k),'sobel');% 用sobel算子,还有roberts算子,prewitt算子等 end else
f=edge(s,'sobel');end
imshow(f);handles.img=f;guidata(hObject,handles);
4.9加入各种噪声 1)高斯噪声
高斯噪声是指它的概率密度函数服从高斯分布的一类噪声。高斯噪声是一种随机噪声,它完全由其时变平均值和两瞬时的协方差函数来确定。%高斯噪声
axes(handles.axes2);y=imnoise(handles.img,'gaussian',0,0.05);%加高斯噪声 imshow(y);handles.img=y;guidata(hObject,handles);
2)椒盐噪声
椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割引起。去除脉冲干扰级椒盐噪声最常用的算法是中值滤波。%•椒盐噪声
axes(handles.axes2);y=imnoise(handles.img,'salt & pepper',0.08);%加椒盐噪声
imshow(y);handles.img=y;guidata(hObject,handles);
3)斑点噪声
斑点噪声是SAR成像系统的一大特色,源自基本分辨单元内地物的随机散射,在图像上表现为信号相关(如在空间上相关)的小斑点,它既降低了图像的画面质量,又严重影响图像的自动分割、分类、目标检测以及其它定量专题信息的提取。SAR斑点噪声的抑制可通过非相干多视处理,也可使用空间域滤波实现。%斑点噪声
axes(handles.axes2);y=imnoise(handles.img,'speckle',0.04);%加斑点噪声 imshow(y);handles.img=y;guidata(hObject,handles);14
4)泊松噪声 %泊松噪声
axes(handles.axes2);y=imnoise(handles.img,'poisson');%加泊松噪声 imshow(y);handles.img=y;guidata(hObject,handles);
4.10滤波 1)高通滤波
高通滤波是只对低于某一给定频率以下的频率成分有衰减作用,而允许这个截止频率以上的频率成分通过,并且没有相位移的滤波过程。主要用来消除低频噪声,保留高频部分。图像中的边缘或线条与图像频谱中的高频分量相对应,因为采用高通滤波器让高频成分顺利通过,可以使图像的边缘或线条更加清楚,从而识相图像的锐化。%高通滤波
axes(handles.axes2);x=(handles.img);f=double(x);% 数据类型转换,matlab不支持图像的无符号整型的计算 k=fft2(f);% 傅里叶变换 g=fftshift(k);% 转换数据矩阵 [M,N]=size(g);nn=2;d0=5;%截止频率5 m=fix(M/2);n=fix(N/2);15
for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);% 计算高通滤波器传递函数
if d<=d0 h=0;else h=1;end
result(i,j)=h*g(i,j);end end
result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);handles.img=y3;guidata(hObject,handles);% 显示滤波处理后的图像
2)低通滤波
图像的边缘以及噪声干扰在图像的频域上对应于图像傅里叶变换中的高频部分,而图像的背景区则对应于低频部分,因此可以用频域低通滤波法去除图像的高频部分,以去掉噪声使图像平滑。对于低通滤波器截止频率的不同,会发生不同程度的“振铃”现象,同时图像变模糊了。截止频率月底,滤除噪声越彻底,高频分量损失越严重,但图像就越模糊。%低通滤波器
axes(handles.axes2);y1=handles.img;f=double(y1);% 数据类型转换,matlab不支持图像的无符号整型的计算 g=fft2(f);% 傅里叶变换 g=fftshift(g);% 转换数据矩阵
[M,N]=size(g);nn=2;%二阶巴特沃斯低通滤波器 d0=50;%截止频率50 m=fix(M/2);n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);h=1/(1+0.414*(d/d0)^(2*nn));% 计算低通滤波器传递函数 result(i,j)=h*g(i,j);end end
result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);% 显示处理后的图像 handles.img=y3;guidata(hObject,handles);
3)中值滤波
中值滤波是抑制噪声的非线性处理方法。给定一个滤波窗口,对于二维图像,窗口形状可以使矩形,圆形及十字形等,对于位于中间位置的那个数值称为这n个数值的中值。中值滤波的算法运算简单,易于实现,而且能较好地保护边界,但有时会失掉图像中的细线和小块的目标区域。%中值滤波
axes(handles.axes2);a=handles.img;if isrgb(a)%对灰度和彩色图像分别处理
for k=1:3 y(:,:,k)=medfilt2(a(:,:,k));%中值滤波
end
else
y=medfilt2(a);%中值滤波 end
imshow(y);handles.img=y;guidata(hObject,handles);
4.11图像变换 1)傅里叶变换
为了得到图像的频谱图,先要对数据进行傅里叶变换,用fft2函数对二维数据进行快速傅里叶变换,同时为了更好的观察频谱图,需要把fft2变换后的数据进行平移,利用fftshift函数,把快速傅里叶变换的DC 组件移到光谱中心。这样图像能量的低频成分将集中到频谱中心,图像上的边缘、线条细节信息等高频成分将分散在图像频谱的边缘。%傅里叶变换
axes(handles.axes2);a=handles.img;if isrgb(a)m=fft2(a(:,:,1));%对图像执行二维傅里叶变换 y=fftshift(m);%使低频能量集中在中心位置 else
m=fft2(a);%对图像执行二维傅里叶变换 y=fftshift(m);%使低频能量集中在中心位置 end
imshow(log(abs(y)),[]);%使用对数使低频部分显示效果更明显
2)离散余弦变换
傅里叶变化的一个最大问题是:它的参数都是复数,在数据的描述上相当于实数的两倍,不易计算,因此希望有一种能达到相同功能但数据量有不大的变换,在这个思想的指导下,产生了离散余弦变换。%离散余弦变换 global T axes(handles.axes2);T=getimage;a=handles.img;gray=rgb2gray(a);d=dct2(gray);%对图像进二维行离散余弦变换
imshow(log(abs(d)),[]);%使用对数使低频部分显示效果更明显
3)Radon变换
Radon函数计算指定方向上图像矩阵的投影,计算一定方向上平行光束的线积分。光线间隔1个象素单位。为了表示图像,radon变换通过围绕图像中心旋转光源来从不同角度获得图像的平行光投影。%Radon变换 global T axes(handles.axes2);theta=0:1:180;%对每个角度做radon变换处理 [r,xp]=radon(T,theta);%Radon变换
imagesc(theta,xp,r);xlabel('degrees');%为x轴做标注 colorbar;%显示颜色条
4.12图像增强 1)伪彩色增强
对于灰度图像,人眼分辨的灰度级只有十几到二十几,而对不同的亮度和色彩图像则可以达到几百甚至上千,因此伪彩色增强是将一个波段或单一的黑白图像变换为彩色图像,从而把人眼不能区分的微小的灰度差别显示为明显的色彩差异,更便于解译和提取有用信息。
伪彩色增强的方法主要有以下三种:亮度切割技术,灰度彩色变换,频域滤波法。
我采用的是亮度切割技术,亮度切割技术是伪彩色增强中最简单的一种方法,它是对图像亮度范围进行分割,使一定亮度间隔对应于某一颜色。对于切割平面以下的分配一中颜色,平面以上的再分配一种颜色。这样,便可以把一幅灰度图像变成一幅伪彩色图像,此法比较直观简单,缺点使变换出的彩色数目有限而且颜色生硬不够调和,量化噪声大。%伪彩色增强 global T axes(handles.axes2);T=getimage;a=handles.img;c=zeros(size(a));%a为原灰度图像矩阵
pos=find(a<100);%找到灰度值小于100的 c(pos)=a(pos);b(:,:,3)=c;%变为蓝色
c=zeros(size(a));%a为原灰度图像矩阵
pos=find((a>=100)&(a<230));%找到灰度值大于100小于230的 c(pos)=a(pos);b(:,:,2)=c;%变为绿色
c=zeros(size(a));%a为原灰度图像矩阵
pos=find(a>=230);%找到灰度值大于230的c(pos)=a(pos);b(:,:,1)=c;%变为红色
b=uint8(b);axes(handles.axes2);imshow(b);handles.img=b;guidata(hObject,handles);
2)真彩色增强
真彩色增强时从彩色到彩色的一种变换。通过一定的映射函数变换成新的三基色分量,彩色合成使得增强图像中各目标呈现出与原图像不同的彩色。通过真彩色增强我们可以达到变换图像引起人们的特别关注,以及通过人眼对不同颜色的灵敏度的不同,使景物呈现出与人眼色觉相匹配的颜色,以提高人眼对目标的分辨力。%真彩色增强 global T axes(handles.axes2);T(:,:,1)=immultiply(T(:,:,1),0.3);%对R基色每个元素乘以0.3 T(:,:,2)=immultiply(T(:,:,2),0.2);%对G基色每个元素乘以0.2 T(:,:,3)=immultiply(T(:,:,3),0.5);%对B基色每个元素乘以0.5 axes(handles.axes2);imshow(T);handles.img=T;guidata(hObject,handles);21
4.12图像翻转 1)上下翻转 %上下翻转 global T axes(handles.axes2);T=getimage;a=handles.img;if isrgb(a)%对灰度和彩色图像分别处理 for k=1:3 y(:,:,k)=flipud(a(:,:,k));end else
y=flipud(a);end
imshow(y);handles.img=y;guidata(hObject,handles);
2)左右翻转 %左右翻转
global T %左右镜像 axes(handles.axes2);T=getimage;a=handles.img;if isrgb(a)%对灰度和彩色图像分别处理
for k=1:3 y(:,:,k)=fliplr(a(:,:,k));%左右翻转 end else
y=fliplr(a);%左右翻转 end
imshow(y);handles.img=y;guidata(hObject,handles);
3)任意角度翻转 %任意角度翻转 global T axes(handles.axes2);T=getimage;prompt={'旋转角度:'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});f=imrotate(handles.img,p1,'bilinear','crop');imshow(f);handles.img=f;guidata(hObject,handles);
4.13特效效果 1)底片效果
通过f=imcomplement(handles.img);实现图像取反,形成底片效果。%底片效果 global T axes(handles.axes2);T=getimage;f=imcomplement(handles.img);%图像取反 imshow(f);handles.img=f;guidata(hObject,handles);
2)运动模糊 %运动模糊 global T global S axes(handles.axes2);S=fspecial('motion',28,15);T=imfilter(handles.img,S,'circular','conv');imshow(T)handles.img=T;guidata(hObject,handles);24
3)浮雕效果
实现图像浮雕效果的一般原理是,将图像上每个像素点与其对角线的像素点形成差值,使相似颜色值淡化,不同颜色值突出,从而产生纵深感,达到浮雕的效果。%浮雕效果 global T axes(handles.axes2);T=getimage;a=handles.img;r=a(:,:,1);%提取红色分量表示的图像 g=a(:,:,2);%提取绿色分量表示的图像 b=a(:,:,3);%提取蓝色分量表示的图像 m = size(a,1);n = size(a,2);for i=3:m-2 for j=3:n-2 rr(i,j)=0.25*r(i-1,j-1)+0.25*r(i-2,j-2)+0.25*r(i,j)+0.25*r(i+1,j+1)-1.0*r(i+2,j+2)+128;gg(i,j)=0.25*r(i-1,j-1)+0.25*g(i-2,j-2)+0.25*g(i,j)+0.25*g(i+1,j+1)-1.0*g(i+2,j+2)+128;bb(i,j)=0.25*b(i-1,j-1)+0.25*b(i-2,j-2)+0.25*b(i,j)+0.25*b(i+1,j+1)-1.0*b(i+2,j+2)+128;end end
A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;axes(handles.axes2);imshow(A)
4)马赛克
一般来说,图片的每个一细节都是由一个小的像素块组成的,如果将其无限放大,每个像素块就会很明显地表现出来,就是我们说的马赛克。马赛克算法很简单,就是把一张图片分割成若干个val * val像素的小区块(可能在边缘有零星的小块,但不影响整体算法,val越大,马赛克效果越明显),每个小区块的颜色都是相同的。而利用Matlab中的放大和缩小函数imresize,可以方便的实现图像的马赛克效果。具体方法为,首先将图片缩小到原图片大小的1/5,再将图片放大五倍还原到原来的大小。由于图片缩小后,部分像素值会丢失,再次放大时就会出现模糊现象,即为马赛克。%马赛克 pix_grp = 15;global T axes(handles.axes2);T=getimage;a=handles.img;height = size(a,1);width = size(a,2);mosaic = imresize(a,[floor(height/pix_grp)floor(width/pix_grp)]);%B = imresize(A, [numrows numcols])将图像A放大,numrows和numcols分别指定目标图像的高度和宽度
mosaic = imresize(mosaic,[height width],'nearest');a=mosaic;imshow(a);
5)雾化效果
设想有一块透明的玻璃,朝上面哈几口气,然后将玻璃放到一张图片上,得到的图像效果就是雾化效果。下面来分析原理从而推导出算法。
玻璃上面哈气后,有很多小水滴小水汽之类的,形状不规则,因此发生光折射,由于水滴的不规则性,发生折射也是不规则的,也就是折射光的折射角不确定,但是肯定有个范围,假设有像素A(i,j),(i和j分别表示横坐标和纵坐标),折射后一定几率在A(i+d,j+d)处,(-k 对每个像素A(i,j)进行处理,用其周围一定范围内随机点A(i+d,j+d),(-k rr(i,j)=r(di,dj);%将原像素点用随机像素点代替 gg(i,j)=g(di,dj);bb(i,j)=b(di,dj); end end A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;imshow(A) 6)倒影效果 对图像的美化过程中,常常需要制作倒影效果,倒影效果可以更好的展现风景图片和建筑物图片的立体效果,达到让欣赏者赏心悦目的效果。对图像进行倒影处理的基本思路是:将原图像A压缩为原来大小的一半,压缩后的图像旋转180度后做左右镜像处理,即B(i,n-j+1)=A(i,j);然后将下半部分图像进行雾化处理,以得到更好的倒影效果,最后将上下两部分图像合成到一个三维数组中,使用imshow函数显示出来就可以了 %倒影效果 global T axes(handles.axes2);T=getimage;a=handles.img;m=size(a,1);n=size(a,2);img_up=imresize(a,[floor(m*0.5),n]);%将原图像压缩为原来大小的一半 img_down=imrotate(a,180);%压缩后的图像旋转180度 r=img_down(:,:,1);g=img_down(:,:,2);b=img_down(:,:,3);for i=1:m for j=1:n %下半部分图像做左右镜像 rr(i,n-j+1)=r(i,j);28 gg(i,n-j+1)=g(i,j);bb(i,n-j+1)=b(i,j);end end A(:,:,1)=rr;A(:,:,2)=gg;A(:,:,3)=bb;%A是镜像以后的图像 img_down=A;%倒影部分进行雾化,实现更好的倒影效果 m1=size(img_down,1);n1=size(img_down,2);r1=img_down(:,:,1);g1=img_down(:,:,2);b1=img_down(:,:,3);for i=2:m1-10 for j=2:n1-10 k=rand(1)*10;di=i+round(mod(k,33));dj=j+round(mod(k,33));rr1(i,j)=r1(di,dj);gg1(i,j)=g1(di,dj);bb1(i,j)=b1(di,dj);end end A1(:,:,1)=rr1;A1(:,:,2)=gg1;A1(:,:,3)=bb1;%雾化完成 img_down=imresize(A1,[floor(m*0.5),n]);A=[img_up;img_down];imshow(A)29 7)阈值分割 一幅图像包括目标,背景和噪声,怎样从灰度图像中取出对象物?灰度阈值法就是把图像的灰度分成不同的等级,然后用设置灰度阈值的方法确定有意义的区域或欲分割物体的边界。设定某一阈值T,对图像进行二值化处理。%阈值分割 global T axes(handles.axes2);T=getimage;a=handles.img;a=double(a(:,:,1));fxy=zeros(1,256);[m,n]=size(a);for i=1:m %统计每个灰度值的个数 for j=1:n c=a(i,j);fxy(c+1)=fxy(c+1)+1;end end figure(1);plot(fxy);p1={'Input Num:'};p2={'180'};p3=inputdlg(p1,'Input Num:1~256',1,p2);p=str2num(p3{1});for i=1:m %小于阈值的为黑,大于阈值的为白 for j=1:n if a(i,j) image1(i,j)=1; end end end imshow(image1); 如果处理目标或背景内部相邻见得灰度值是高度相关的,但处于目标和背景交界处两边的像素在灰度值上有很大的差别,则它的灰度直方图基本可以看做是分别对应目标和背景的两个单峰直方图混合成,如上图。我们选取波谷作为阈值分割点,就可以将目标和背景分离开了,将目标显示出来。如下图: 阈值分割在交通系统中的车牌识别中扮演着重要的角色,由于车牌的材料有反光的性能,当抓拍到车牌后,对图像进行阈值分割可以得到不错的效果。如下图,对一幅添加了高斯噪声的车牌进行阈值分割: 通过对灰度直方图的统,可以看到大致的两个波峰,取其波谷为分割点,灰度值大概在190左右,大于190的为白,小于190的为黑。 8)添加水印 为了给自己处理过的图像添加标志,设计了添加水印的功能。该功能的主要思想是,图像即为数组,如果要再图像上添加水印,也就是用另一幅图像的数据去覆盖原图像对应部分的数据,也就是对数组内容的替换。然后就是关于水印添加的方位了,由于添加方位的不同,所要替代的范围的不同了。%添加水印 global T axes(handles.axes2);T=getimage;a=handles.img;[filename,pathname]=...uigetfile({'*.jpg';'*.bmp';'*.gif'},'watermark');str=[pathname filename];b=imread(str);m1=size(a,2);n1=size(a,1);m2=size(b,2);n2=size(b,1);c=a((n1-n2+1):n1,(m1-m2+1):m1,:);p1={'Input Num:'};p2={'2'}; p3=inputdlg(p1,'Input Num:1~4',1,p2);p=str2num(p3{1});if isrgb(a)&isrgb(b)switch p case 1 a(1:n2,1:m2,:)=b;%左上角 case 2 a(1:n2,(m1-m2+1):m1,:)=b;%右上角 case 3 a((n1-n2+1):n1,1:m2,:)=b;%左下角 case 4 b=imadd(imadd(c,b),-50);a((n1-n2+1):n1,(m1-m2+1):m1,:)=b;%右下角 otherwise msgbox('error,');end imshow(a);elseif isgray(a)&isgray(b)switch p case 1 a(1:n2,1:m2)=b;%左上角 case 2 a(1:n2,(m1-m2+1):m1)=b;%右上角 case 3 a((n1-n2+1):n1,1:m2)=b;%左下角 case 4 a((n1-n2+1):n1,(m1-m2+1):m1)=b;%右下角 otherwise msgbox('error');end imshow(a);else msgbox('error,the type of two pictures is mismatching');end 5、结果分析 在刚开始学习GUI时,是按着视频教程一步一步的学习的,由于视频介绍的比较简单,很多相应功能都不知道相应的回调函数该怎么写,后来就借了本图像处理matlab版本的书籍以及上网查了一些资料,之后的设计之路就轻松多了,特别是借助于功能强大的help,相应的一些小问题基本都可以自己找出并解决。 因为读入图像得到的是个矩阵,所以说对图像处理也就是对矩阵做相应的修改变换,在矩阵运算过程中遇到了几个很典型的问题。 1)有些函数只能对灰度图像进行操作例如左右翻转函数,所以当图像时彩色图像时就要执行for k=1:3 y(:,:,k)=fliplr(a(:,:,k));%左右翻转 end 操作 2)在实现图像放大,缩小,亮度调整等功能时,为了方便修改,设置对话框输入,但从对话框输入的数其实是字符,并不是真正的整型数值,所以如果没有对字符转数值变化,就会得到错误的结果,举个简单的例子: a=’2’;b=2;a*b ans = 100 得到的100并不是我们所想要的4,之所以还会出结果是因为,字符2对应的ASCII码值为50,而matlab有支持这种算法,所以会得到100的结果。 正确的做法应该是这样: a=’2’;a=str2num(s);b=2;a*b ans = 4 所以说我们在对数据做处理的时候,一定要分清出它的类型,以免到时候查不出错误。 3)关于全局变量的设置,打开了一张图片,为了能供每个功能做相应的处理,就得把图片矩阵的属性设置为global T,这样做以后却只能实现对源图像做处理,如果要对处理过后的图像再做处理,我们就要把处理完后的新图像矩阵赋给源图像,T=y,这样就可以实现每次处理的对象都为上次处理完的图像了。 4)??? Error using ==> * Function '*' is not defined for values of class 'uint8'.对于不同的图像类型,图像矩阵元素的类型也不一样。对于真彩色图像,数据矩阵类型是uint8;对于索引图像,数据矩阵类型可以是double型或者uint8型;对于灰度图像,数据矩阵类型可以是double型或者uint8型;对于二值图像,数据矩阵类型可以是double型或者uint8型。当类型不支持时,我们可以通过强制类型转换来得到所需数据类型,如:double(m).6、心得体会 通过这次“基于matlab的数字图像处理”的GUI课程设计,学到了很多很多,最基本的就是重新熟悉了matlab语言,不仅仅只是在matlab编程上面有所提高和对GUI的熟悉,对数字图像处理也有了更深刻的认识。 当我第一次拿到此次的课题时,感到有些无所适从。虽然,曾经学习过matlab的课程,在课程的考核中也取得了较好的成绩,但由于对matlab的学习更多的只是停留在理论上的学习,在课时内的试验也只是简单的基础性试验,所以对matlab实际运用不是很熟练。 为此,在实践正式开始前,我利用课余时间,重新复习了matlab教材,专门借阅了利用matlab进行图像处理的相关教程,通过索引网络上的相关资料,为课设做了较为充分的准备。在参考了相关材料及源程序,我对自己要做的课设内容有了进一步的了解,并对matlab的使用有了更深的体会。 首先,明白了图像对于matlab而言就是矩阵,灰度图像和彩色图像对应于不同维数的矩阵,分别为二维和三维,其中三维矩阵每一位代表一种颜色。矩阵可以使实数,也可以使复数,不同的图像矩阵的元素对应于不同的类型,有double,uint8,uint16,logic等类型。由于几乎所有的matlab函数及其工具箱函数都可以使用double作为参数类型,不过由于64bit来表示图像数据存储量特别巨大,所以matlab还支持图像数据的无符号整型存储,所以使用时还要注意输出数据类型的转换。 其次,学会了要善于使用matlab中现有的函数。 最后,我们必须要明白理论指导实践,要想实现预期的效果,必须明白它实现的机制和相应的算法,只有通过相应的理论来指导,我们才能有所创新,才能有所突破,而不只是单纯的引用相应的处理函数。例如对于截图函数,它只能是截取坐标轴内的图像,对坐标轴意外的图像却不能处理,而且对于同时显示在坐标轴上的几张图像,它只能处理最后显示的那张,如果我们通过对它改进,能实现像qq截图那样的功能就很强大了。不过通过这次的实现,我对图像的模式,彩色空间,存储结构,图像的傅里叶变换,离散余弦变换的原理,图像的平滑和锐化的算子,直方图的用途和直方图均衡化原理,图像的伪彩色和真彩色增强,以及阈值分割原理都有了更清楚的认识,也明白了它们的实现机制。还有就是,如今的GUI只能在matlab环境下运行,如果能转化成exe 格式,就能独立于matlab外执行了,还有很多很多新功能等待我们去探索。总体来说,此次的课程设计,还是较为满意的。它不但鞭策着我去巩固matlab的基础理论知识,还提高了我对matlab的实际操作运用,使得理论与实践相结合,为进一步学习matlab打下坚实的基础;同时,在实践的工程中,也让我体会到一种努力付出并得到回报的满足感觉。 参考书目: [1]《MATLAB实用教程》 [2] 《数字图像处理与分析》 郑阿奇 电子工业出版社 张弘.机械工业出版社 36 附录: function varargout = untitled1(varargin)% UNTITLED1 M-file for untitled1.fig % UNTITLED1, by itself, creates a new UNTITLED1 or raises the existing % singleton*.% % H = UNTITLED1 returns the handle to a new UNTITLED1 or the handle to % the existing singleton*.% % UNTITLED1('CALLBACK',hObject,eventData,handles,...)calls the local % function named CALLBACK in UNTITLED1.M with the given input arguments.% % UNTITLED1('Property','Value',...)creates a new UNTITLED1 or raises the % existing singleton*.Starting from the left, property value pairs are % applied to the GUI before untitled1_OpeningFcn gets called.An % unrecognized property name or invalid value makes property application % stop.All inputs are passed to untitled1_OpeningFcn via varargin.% % *See GUI Options on GUIDE's Tools menu.Choose “GUI allows only one % instance to run(singleton)”.% % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help untitled1 % Last Modified by GUIDE v2.5 22-Jun-2012 19:36:46 % Begin initialization codeDO NOT EDIT %---Executes just before untitled1 is made visible.function untitled1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn.% hObject handle to figure % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output;%------ function Untitled_2_Callback(hObject, eventdata, handles)% hObject handle to Untitled_2(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%保存图像 [sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');if ~isequal([sfilename,sfilepath],[0,0]) sfilefullname=[sfilepath ,sfilename]; imwrite(handles.img,sfilefullname);else msgbox('你按了取消键','保存失败');end %------ function Untitled_4_Callback(hObject, eventdata, handles)% hObject handle to Untitled_4(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %亮度调节 axes(handles.axes2);prompt={'调整倍数'};defans={''};p=inputdlg(prompt,'input',1,defans);p1=str2num(p{1});y=imadjust(handles.img,[ ], [ ],p1);% 亮度调节 imshow(y); handles.img=y; guidata(hObject,handles); % ------ function Untitled_9_Callback(hObject, eventdata, handles) % hObject handle to Untitled_9(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%灰度变换 global T axes(handles.axes2); T=getimage;if isrgb(s)%对灰度图像和彩色图像分x=rgb2gray(handles.img);%灰度变换 别处理 imshow(x);a=histeq(s(:,:,1));%对每一种基色直handles.img=x;方图均衡 guidata(hObject,handles);b=histeq(s(:,:,2));c=histeq(s(:,:,3));k(:,:,1)=a;% k(:,:,2)=b;------k(:,:,3)=c;imshow(k);function Untitled_15_Callback(hObject, else eventdata, handles)y=histeq(s);%对灰度图像直方图均衡 % hObject handle to Untitled_15(see imshow(y);GCBO)handles.img=y;% eventdata reservedto be defined in guidata(hObject,handles);a future version of MATLAB % handles structure with handles and user data(see GUIDATA)% global T------axes(handles.axes2);T=getimage;function Untitled_17_Callback(hObject, s=handles.img;eventdata, handles)if isrgb(s)%对灰度图像和彩色图像分别% hObject handle to Untitled_17(see 处理 GCBO)for k=1:3 % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%高斯噪声 axes(handles.axes2);y=imnoise(handles.img,'gaussian',0,0.05);%加高斯噪声 imshow(y);handles.img=y;guidata(hObject,handles);%------ function Untitled_22_Callback(hObject, eventdata, handles)% hObject handle to Untitled_22(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%斑点噪声 axes(handles.axes2); y=imnoise(handles.img,'speckle',0.04);%加斑点噪声 imshow(y); handles.img=y; guidata(hObject,handles); % ------ function Untitled_24_Callback(hObject, eventdata, handles)% hObject handle to Untitled_24(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%高通滤波 axes(handles.axes2);x=(handles.img);f=double(x);% 数据类型转换 k=fft2(f);% 傅里叶变换 g=fftshift(k);% 转换数据矩阵 [M,N]=size(g);nn=2;d0=5;%截止频率5 m=fix(M/2);n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2);% 计算高通滤波器传递函数 if d<=d0 h=0;else h=1;end result(i,j)=h*g(i,j);end end result=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3);handles.img=y3;guidata(hObject,handles);% 显示滤波处理后的图像 %------ function Untitled_28_Callback(hObject, eventdata, handles)% hObject handle to Untitled_28(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%上下翻转 global T axes(handles.axes2);T=getimage;a=handles.img; if isrgb(a)%对灰度和彩色图像分别处理 for k=1:3 y(:,:,k)=flipud(a(:,:,k));%上下翻转 end else y=flipud(a);%上下翻转 end imshow(y); handles.img=y; guidata(hObject,handles); %------ function Untitled_44_Callback(hObject, eventdata, handles)% hObject handle to Untitled_44(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%伪彩色增强 global T axes(handles.axes2);T=getimage;a=handles.img; c=zeros(size(a));%a为原灰度图像矩阵 pos=find(a<100);%找到灰度值小于100的 c(pos)=a(pos); b(:,:,3)=c;%变为蓝色 c=zeros(size(a));%a为原灰度图像矩阵 pos=find((a>=100)&(a<230));%找到灰度值大于100小于230的 c(pos)=a(pos); b(:,:,2)=c;%变为绿色 c=zeros(size(a));%a为原灰度图像矩阵 pos=find(a>=230);%找到灰度值大于230的c(pos)=a(pos); b(:,:,1)=c;%变为红色 b=uint8(b); axes(handles.axes2);imshow(b); handles.img=b; guidata(hObject,handles);% ------ function Untitled_40_Callback(hObject, eventdata, handles)% hObject handle to Untitled_40(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %------ function Untitled_35_Callback(hObject, eventdata, handles)% hObject handle to Untitled_35(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%离散余弦变换 global T axes(handles.axes2);T=getimage;a=handles.img;gray=rgb2gray(a); d=dct2(gray);%对图像进二维行离散余弦变换 imshow(log(abs(d)),[]);%使用对数使低频部分显示效果更明显 % ------ function Untitled_45_Callback(hObject, eventdata, handles)% hObject handle to Untitled_45(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%双线性插值法放大 global T axes(handles.axes2);T=getimage;prompt={'输入放大倍数:'};defans={''};p=inputdlg(prompt,'输入放大倍数',1,defans);p1=str2num(p{1});y=imresize(handles.img,p1,'bilinear');%双线性插值法放大 imshow(y);handles.img=y;guidata(hObject,handles); %------ function Untitled_47_Callback(hObject, eventdata, handles)% hObject handle to Untitled_47(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%双线性插值法缩小 global T axes(handles.axes2);T=getimage; prompt={'输入放大倍数:'};defans={''}; p=inputdlg(prompt,'输入放大倍数',1,defans); p1=str2num(p{1}); y=imresize(handles.img,p1,'bilinear');%双线性插值法缩小 imshow(y); handles.img=y;guidata(hObject,handles); %------ function Untitled_50_Callback(hObject, eventdata, handles)% hObject handle to Untitled_50(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%撤销 axes(handles.axes2);global T imshow(T);handles.img=T;guidata(hObject,handles); % ------ function Untitled_54_Callback(hObject, eventdata, handles)% hObject handle to Untitled_54(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) [sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');if ~isequal([sfilename,sfilepath],[0,0]) sfilefullname=[sfilepath ,sfilename]; imwrite(handles.img,sfilefullname);else msgbox('你按了取消键','保存失败');end %------function uipushtool5_ClickedCallback(hObject, eventdata, handles)% hObject handle to uipushtool5(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)axes(handles.axes2);p1=str2num('5'); y=imresize(handles.img,p1,'nearest');%最近邻插值法放大 imshow(y); handles.img=y; guidata(hObject,handles); %---Executes on button press in pushbutton4.function pushbutton4_Callback(hObject, eventdata, handles)% hObject handle to pushbutton4(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)axes(handles.axes2);p1=str2num('0.2');y=imresize(handles.img,p1,'nearest');%最近邻插值法放大 imshow(y);handles.img=y;guidata(hObject,handles); %------function uitoggletool1_ClickedCallback(hObject, eventdata, handles)% hObject handle to uitoggletool1(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) global S axes(handles.axes2);%还原 y=imread(S);f=imshow(y);handles.img=y; guidata(hObject,handles);% ------ function Untitled_57_Callback(hObject, eventdata, handles)% hObject handle to Untitled_57(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%Radon变换 global T axes(handles.axes2);theta=0:1:180;%对每个角度做radon变换处理 [r,xp]=radon(T,theta);%Radon变换 imagesc(theta,xp,r);xlabel('degrees');%为x轴做标注 colorbar;%显示颜色条 %------ function Untitled_59_Callback(hObject, eventdata, handles)% hObject handle to Untitled_59(see GCBO)% eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)%还原 global S axes(handles.axes2);y=imread(S);f=imshow(y);handles.img=y; guidata(hObject,handles); %---Executes during object creation, after setting all properties.function figure1_CreateFcn(hObject, eventdata, handles) % hObject handle to figure1(see GCBO)% eventdata reservedhandles not created until after all CreateFcns called %---Executes during object creation, after setting all properties.%添加背景图片 im=axes('units','normalized','position',[0 0 1 1]); uistack(im,'down');II=imread('9.jpg');image(II); colormap gray; set(im,'handlevisibility','off','visible',off); ------%------function Untitled_62_Callback(hObject, eventdata, handles)function Untitled_61_Callback(hObject, % hObject handle to Untitled_62(see eventdata, handles)GCBO)% hObject handle to Untitled_61(see % eventdata reservedto be defined in % handles structure with handles and a future version of MATLAB user data(see GUIDATA)% handles structure with handles and %马赛克 user data(see GUIDATA).pix_grp = 15;%浮雕效果 global T global T axes(handles.axes2);axes(handles.axes2);T=getimage;T=getimage;a=handles.img;a=handles.img;height = size(a,1);r=a(:,:,1);%提取红色分量表示的图像 width = size(a,2);g=a(:,:,2);%提取绿色分量表示的图像 mosaic = b=a(:,:,3);%提取蓝色分量表示的图像 imresize(a,[floor(height/pix_grp)m = size(a,1);floor(width/pix_grp)]);n = size(a,2);%B = imresize(A, [numrows numcols])将for i=3:m-2 图像A放大,numrows和numcols分别指定目for j=3:n-2 标图像的高度和宽度 rr(i,j)=0.25*r(i-1,j-1)+0.25*r(i-2,j-mosaic = imresize(mosaic,[height 2)+0.25*r(i,j)+0.25*r(i+1,j+1)-1.0*r(width],'nearest');i+2,j+2)+128;a=mosaic;gg(i,j)=0.25*r(i-1,j-1)+0.25*g(i-2,j-imshow(a);2)+0.25*g(i,j)+0.25*g(i+1,j+1)-1.0*g(i+2,j+2)+128;bb(i,j)=0.25*b(i-1,j-1)+0.25*b(i-2,j-% 2)+0.25*b(i,j)+0.25*b(i+1,j+1)-1.0*b(------i+2,j+2)+128;end function Untitled_63_Callback(hObject, end eventdata, handles)A(:,:,1)=rr;% hObject handle to Untitled_63(see A(:,:,2)=gg;GCBO)A(:,:,3)=bb;% eventdata reserved-to be defined in axes(handles.axes2);a future version of MATLAB imshow(A)% handles structure with handles and user data(see GUIDATA) %雾化效果 global T % axes(handles.axes2); MATLAB实践报告 2016/2017学年 第一学期 专 业: 电气工程及其自动化 班 级: 学 号: 姓 名: 2017年 2 月 目录 第1章 引言.....................................................................................................................................1 第2章MATLAB功能介绍............................................................................................................2 2.1 MATLAB功能特性...........................................................................................................2 2.1.1主要功能..................................................................................................................2 2.1.2 MATLAB产品系列重要功能................................................................................2 2.2MATLAB优势特点............................................................................................................2 2.2.1编程环境..................................................................................................................3 2.2.2简单易用..................................................................................................................3 2.2.3强处理能力..............................................................................................................3 2.2.4应用软件开发..........................................................................................................3 2.3MATLAB应用方面............................................................................................................3 第3章MATLAB课程设计任务....................................................................................................5 3.1任务一 MATLAB环境语法、基本运算及绘图..............................................................5 3.1.1目的..........................................................................................................................5 3.1.2原理..........................................................................................................................5 3.1.3内容..........................................................................................................................5 3.2任务二 MATLAB数值运算.............................................................................................9 3.2.1目的..........................................................................................................................9 3.2.2原理..........................................................................................................................9 3.2.3内容..........................................................................................................................9 3.3任务三 MATLAB的符号计算.......................................................................................15 3.3.1目的........................................................................................................................15 3.3.2内容........................................................................................................................15 3.4任务四 MATLAB基本编程方法...................................................................................18 3.4.1目的........................................................................................................................18 3.4.2内容........................................................................................................................18 第4章 总结...................................................................................................................................23 第1章 引言 MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。 MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。 MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。 MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。 第2章MATLAB功能介绍 2.1 MATLAB功能特性 2.1.1主要功能 1.数值分析 2.数值和符号计算 3.数字图像处理 4.数字信号处理 5.工程与科学绘图 6.控制系统与仿真 7.通讯系统设计与仿真 8.财务与金融工程 2.1.2 MATLAB产品系列重要功能 ·MATLAB®: MATLAB 语言的单元测试框架 ·Trading Toolbox™: 一款用于访问价格并将订单发送到交易系统的新产品 ·Financial Instruments Toolbox™: 赫尔-怀特、线性高斯和 LIBOR 市场模型的校准和 Monte Carlo 仿真 ·Image Processing Toolbox™: 使用有效轮廓进行图像分割、对 10 个函数实现 C 代码生成,对 11 个函数使用 GPU 加速 ·Image Acquisition Toolbox™: 提供了用于采集图像、深度图和框架数据的 Kinect® for Windows®传感器支持 ·Statistics Toolbox™: 用于二进制分类的支持向量机(SVM)、用于缺失数据的 PCA 算法和 Anderson-Darling 拟合优度检验 MATLAB工作界面 ·Data Acquisition Toolbox™: 为 Digilent Analog Discovery Design Kit 提供了支持包 ·Vehicle Network Toolbox™: 为访问 CAN 总线上的 ECU 提供 XCP 2.2MATLAB优势特点 1.高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来; 2.具有完备的图形处理功能,实现计算结果和编程的可视化; 3.友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握; 4.功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等),为用户提供了大量方便实用的处理工具。 2.2.1编程环境 MATLAB由一系列工具组成。这些工具方便用户使用MATLAB的函数和文件,其中许多工具采用的是图形用户界面。包括MATLAB桌面和命令窗口、历史命令窗口、编辑器和调试器、路径搜索和用于用户浏览帮助、工作空间、文件的浏览器。随着MATLAB的商业化以及软件本身的不断升级,MATLAB的用户界面也越来越精致,更加接近Windows的标准界面,人机交互性更强,操作更简单。而且新版本的MATLAB提供了完整的联机查询、帮助系统,极大的方便了用户的使用。简单的编程环境提供了比较完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进行出错原因分析。 2.2.2简单易用 MATLAB是一个高级的矩阵/阵列语言,它包含控制语句、函数、数据结构、输入和输出和面向对象编程特点。用户可以在命令窗口中将输入语句与执行命令同步,也可以先编写好一个较大的复杂的应用程序(M文件)后再一起运行。新版本的MATLAB语言是基于最为流行的C++语言基础上的,因此语法特征与C++语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。使之更利于非计算机专业的科技人员使用。而且这种语言可移植性好、可拓展性极强,这也是MATLAB能够深入到科学研究及工程计算各个领域的重要原因。 2.2.3强处理能力 MATLAB是一个包含大量计算算法的集合。其拥有600多个工程中要用到的数学运算函数,可以方便的实现用户所需的各种计算功能。函数中所使用的算法都是科研和工程计算中的最新研究成果,而且经过了各种优化和容错处理。在通常情况下,可以用它来代替底层编程语言,如C和C++。在计算要求相同的情况下,使用MATLAB的编程工作量会大大减少。MATLAB的这些函数集包括从最简单最基本的函数到诸如矩阵,特征向量、快速傅立叶变换的复杂函数。函数所能解决的问题其大致包括矩阵运算和线性方程组的求解、微分方程及偏微分方程的组的求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数的各种运算、三角函数和其他初等数学运算、多维数组操作以及建模动态仿真等。 2.2.4应用软件开发 在开发环境中,使用户更方便地控制多个文件和图形窗口;在编程方面支持了函数嵌套,有条件中断等;在图形化方面,有了更强大的图形标注和处理功能,包括对性对起连接注释等;在输入输出方面,可以直接向Excel和HDF5进行连接。 2.3MATLAB应用方面 MATLAB 产品族可以用来进行以下各种工作: ●数值分析 ●数值和符号计算 ●工程与科学绘图 ●控制系统的设计与仿真 ●数字图像处理技术 ●数字信号处理技术 ●通讯系统设计与仿真 ●财务与金融工程 ●管理与调度优化计算(运筹学) MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用MATLAB函数集)扩展了MATLAB 环境,以解决这些应用领域内特定类型的问题。 第3章MATLAB课程设计任务 3.1任务一 MATLAB环境语法、基本运算及绘图 3.1.1目的 1、掌握 MATLAB软件使用的基本方法; 2、熟悉 MATLAB 的数据表示、基本运算方法; 3、熟悉 MATLAB 绘图命令及基本绘图控制。 3.1.2原理 MATLAB环境是一种为数值计算、数据分析和图形显示服务的交互式的环境。MATLAB有3种窗口,即:命令窗口(The Command Window)、m-文件编辑窗口(The Edit Window)和图形窗口(The Figure Window),而Simulink另外又有Simulink模型编辑窗口。 1.命令窗口(The Command Window) 当MATLAB启动后,出现的最大的窗口就是命令窗口。用户可以在提示符“>>”后面输入交互的命令,这些命令就立即被执行。 在MATLAB中,一连串命令可以放置在一个文件中,不必把它们直接在命令窗口内输入。在命令窗口中输入该文件名,这一连串命令就被执行了。因为这样的文件都是以“.m”为后缀,所以称为m-文件。 2.m-文件编辑窗口(The Edit Window)我们可以用m-文件编辑窗口来产生新的m-文件,或者编辑已经存在的m-文件。在MATLAB主界面上选择菜单“File/New/M-file”就打开了一个新的m-文件编辑窗口;选择菜单“File/Open”就可以打开一个已经存在的m-文件,并且可以在这个窗口中编辑这个m-文件。 3.1.3内容 1、帮助命令,使用 help 命令,查找 exp(求幂)函数的使用方法,如图3-1。 图3-1 exp(求幂)函数的使用方法图 2、矩阵运算 (1)矩阵的乘法,已知 A=[1 2 3;2 3 4;1 3 5];B=[1 2 3;4 5 6;2 1 6],求 A*B,A^2,A.*B,A^2*B。结果如下: (2)矩阵除法,已知 A=[1 2 3;3 5 6;4 8 6];B=[1 0 0;0 2 0;0 0 3];AB,A/B,A./B,A.B。结果如下: (3)矩阵的转置及共轭转置,已知 A=[5+i,2-i,1;6*i,4,9-i];求 A.', A'。结果如下: (4)使用冒号选出指定元素,已知: A=[1 2 3;4 5 6;7 8 9];求 A 中第 3 列前 2 个元素;A 中所有列第 2,3 行的元素。结果如下: 3、多项式 (1)求多项式 p(x)= x3 + 2x+ 4的根。结果如下: (2)已知 A=[1.2 3 5 0.9;5 1.7 5 6;3 9 0 1;1 2 3 4],求矩阵 A 的特征多项式;求特征多项式中未知数为 20 时的值; 把矩阵 A 作为未知数代入到多项式中。结果如下图所示: 图3-2 结果图 图3-3结果图 4、基本绘图命令 在同一坐标系中绘制余弦曲线 y=cos(t-0.2)和正弦曲线 y=sin(t-0.3),t∈[0,2π];余弦曲线 y=cos(t-0.2)的线形为点划线、颜色为绿色、数据点标记为加号;正弦曲线 y=sin(t-0.3)的线形为虚线、颜色为红色、数据点标记为星号;显示坐标的范围、刻度线、网络线;标注坐标轴名称、标题。 程序: 图3-4程序图 图3-5结果图 3.2任务二 MATLAB数值运算 3.2.1目的 1.熟悉Matlab中各类数据,尤其是矩阵的定义、赋值和运用; 2.了解Matlab的矩阵分析函数以及求线性方程组的数值解; 3.熟悉多项式运算函数、数值插值。 3.2.2原理 1.创建矩阵的方法 a.直接输入法规则:矩阵元素必须用[ ]括住;矩阵元素必须用逗号或空格分隔;在[ ]内矩阵的行与行之间必须用分号分隔。逗号和分号的作用:逗号和分号可作为指令间的分隔符,matlab允许多条语句在同一行出现。分号如果出现在指令后,屏幕上将不显示结果。 b.用matlab函数创建矩阵:空阵 [ ] — matlab允许输入空阵,当一项操作无结果时,返回空阵;rand —— 随机矩阵;eye —— 单位矩阵;zeros ——全部元素都为0的矩阵;ones ——全部元素都为1的矩阵 c.矩阵的修改:可用键找到所要修改的矩阵,用键移动到要修改的矩阵元素上即可修改;指令修改:可以用A(,)= 来修改。 2.矩阵运算 a.矩阵加、减(+,-)运算规则:(1)相加、减的两矩阵必须有相同的行和列两矩阵对应元素相加减。(2)允许参与运算的两矩阵之一是标量。标量与矩阵的所有元素分别进行加减操作。 b.矩阵乘(,./,.)运算规则:A矩阵的列数必须等于B矩阵的行数;标量可与任何矩阵相乘。 c.矩阵乘方—— a^n,a^p,p^a a ^ p —— a 自乘p次幂,对于p的其它值,计算将涉及特征值和特征向量,如果p是矩阵,a是标量,a^p使用特征值和特征向量自乘到p次幂;如a,p都是矩阵,a^p则无意义。 d.多项式运算 matlab语言把多项式表达成一个行向量,该向量中的元素是按多项式降幂排列的。 f(x)=anxn+an-1xn-1+……+a0 可用行向量 p=[an an-1 …… a1 a0]表示;poly —— 产生特征多项式系数向量 e.代数方程组求解 matlab中有两种除运算左除和右除。 3.2.3内容 1.输入下列向量(矩阵),>> g = [1 2 3 4];h = [4 3 2 1]。 2.分别执行以下数组点运算,>> s1 = g + h, s2 = g.*h, s3 = g.^h,s4 = g.^2, s5 = 2.^h。 3.输入下列特殊矩阵,>>A=[ ],>>A=eye(10),A=rand(10,15),>> A=randn(5,10),>> A=zeros(5,10)。 图3-6 结果图 图3-7 结果图 图3-8 结果图 >>A=ones(5,10),>> 图3-9 结果图 图3-10 结果图 4.输入下列矩阵及矩阵函数 >> A=[2 0 –1;1 3 2];B=[1 7 –1;4 2 3;2 0 1];>> M = A*B % 矩阵A与B按矩阵运算相乘 >> det_B = det(B) % 矩阵A的行列式 >> rank_A = rank(A) % 矩阵A的秩 >> inv_B = inv(B) % 矩阵B的逆矩阵 >> [V,D] = eig(B) % 矩阵B的特征值矩阵V与特征向量构成的矩阵D >> X = A/B % A/B = A*B-1,即XB=A,求X >> Y = BA’ % BA’ = B-1*A’,即BY=A’,求Y 5.多项式运算 >> p=[1 2 0-5 6] >> rr=roots(p)>> pp=poly(rr)>> s=[0 0 1 2 3] >> c=conv(p,s)>> d=polyder(p)>> x=-1:0.1:2;>> y=polyval(p,x) 43% 表示多项式p(x)x2x5x6 % 求多项式p的根 % 由根的列向量求多项式系数 2s(x)x2x3 % 表示多项式 % 多项式乘积 % 多项式微分 % 计算多项式的值 图3-11 结果图 10(s3)6.有理多项式: G(s)(s1)(s2s3) >> n=conv([10],[1 3]) % 定义分子多项式 >> d=conv([1 1],[1 1 3]) % 定义分母多项式 >> [r,p,k]=residue(n,d) % 进行部分分式展开 >> p1=[1-p(1)],p2=[1-p(2)] % 定义两个极点多项式p1(s)=s-p(1),p2(s)=s-p(2)>> den=conv(p1,p2) % 求分母多项式den=p1(s)*p2(s) >> r1=r(1),r2=r(2)>> num=conv(r1,p2)+conv(r2,p1)% 求分子多项式 >> [num,den]=residue(r,p,k)% 根据r,p,k的值求有理多项式 7.函数插值运算 线形样条插值 >>x=0:10 >> y=sin(x)>> x0=[ 3.4 4.7 6.5 8.2] >> y0=interp1(x,y,x0) % 线形插值 >> x1=0:0.1:10 >> y1=sin(x1)>> plot(x1,y1,'r:',x,y,'b*',x0,y0,'g.')% 插值比较 图3-12 结果图 3.3任务三 MATLAB的符号计算 3.3.1目的 1、掌握 MATLAB符号表达式的创建及代数运算; 2、掌握 MATLAB符号微积分; 3、掌握MATLAB 符号方程的求解。 3.3.2内容 a11a12 1、求矩阵Aa21a22a31a32 a13a23的行列式、逆阵和特征值。a33 15 图3-13 结果图 432 2.因式分解x5x5x5x6 432(x1)5x5(x2)5x1的同类项。3.合并 4(x1)4.求的展开式。 5.求下列式子极限 : limx2ln(sinx) (2x) 6.求下列函数的导数 yexcosxx3及当x=3时的导数值。 7.已知矩阵 exAsinx x22xlnx,求A的导数 8.求下列积分: (1) sinx1sinx2dx(2) 0sinx3sinx5dx 9.求微分方程 x22xyy2(y2xy)dy0dxy|x11 3.4任务四 MATLAB基本编程方法 3.4.1目的 1、掌握 MATLAB 软件使用的基本方法; 2、熟悉 MATLAB 程序设计的基本方法。 3.4.2内容 1、编写程序完成如下功能:提示用户输入1或者2,当用户输入1时,对产生的随机序列进行降序排序;当用户输入2时,对产生的随机序列进行升序排列。 程序如下: clear; syms n ikey=0;while(ikey==0)s1=input('请输入[1/2]?','s');x=randperm(10)if(s1=='2') ikey=1; y=sort(x,'ascend'); disp(['升序排列的向量为:',num2str(y)]);else if(s1=='1') ikey=1; y=sort(x,'descend'); disp(['降序排列的向量为:',num2str(y)]); end break end end 图3-14 结果图 2、编写程序实现如下功能:如果想对一个变量 x 自动赋值,当从键盘输入 y 或 Y 时(表示是),x 自动赋为 1;当从键盘输入 n 或 N 时(表示否),x 自动赋为 0;输入其他字符时终止程序。 程序如下: ikey=0;while(ikey==0)s1=input('若给X赋值请输入[y/n]?','s');if(s1=='y'|s1=='Y'), ikey=1;x=1 else if(s1=='n'|s1=='N')ikey=1;x=0,end break end End 3-15 结果图 3.编写函数实现如下功能:输入一个百分制的成绩,要求输出成绩的等级,其中90-100分输出为优秀,80-89分输出为良好,70-79输出为中等,60-69输出为及格,60分以下不及格,如果输入的数据不是百分制,显示出错信息并提示:请输出百分制成绩。 程序如下: clear;m=input('请输入一个数值:');m=ceil(m/10);switch m case {10,9} disp('优秀');case 8 disp('良好');case 7 disp('中等');case 6 disp('及格');case {5,4,3,2,1,0} disp('不及格');otherwise disp('输入有误!')End 运行结果: 请输入百分之原始成绩:92 五级制成绩为: 优秀 请输入百分之原始成绩:88 五级制成绩为: 良好 请输入百分之原始成绩:64 五级制成绩为: 及格 请输入百分之原始成绩:56 五级制成绩为: 不及格 4.编写函数计算s=n!syms n s=1 N=input('data n:');for i=1:N s=s*i;end s s = 1 data n:6 s = 720 5.编写程序,计算1+3+5+…(2n+1)的值,使用input语句输入n的值。程序如下: n=input('input: n=');s = sum(1:2:(2*n+1))input: n=7 运行结果: s = 64 第4章 小结 通过这次对MATLAB的亲身操作和实践,学习掌握了许多原本不知道的或者不太熟悉的命令。比如说相关m文件的建立,画图用到的标注,配色,坐标控制,同一张图里画几幅不同的图像,相关参数的设置以及相关函数的调用格式等等。 就拿建立一个数学方程而言,通过设置不同的参数达到所需要的要求和结果,而且还可以在不同的窗口建立不同的函数而达到相同的效果,比如说可以再命令窗口和m文件中通过不同的命令设置的到相同的所需的效果图。而自己对于矩阵及闭环传递函数的建立原本所掌握的知识几乎为零,而通过这次实验使我彻底的掌握了相关的命令操作和处理的方法,在这里我们不仅可以通过建立函数和参数来达到目标效果,而且还可以通过可视化的编程达到更快更方便,更简洁的效果。就拿可视化编程而言原本根本就只是听说而已罢了,从来就没有亲身去尝试过,然而现在自己却可以和容易的通过搭建不同功能木块来实现相关的函数及功能。这些在原本根本就不敢相信,然而通过MATLAB的学习和实验亲身操作这些原本看似不可能的操作在此就变的轻而易举的事了。 要想取得更大的成绩就得不断的去努力学习和汲取相关的知识和技巧。万不可自以为傲,裹足不前,MATLAB真的是个非常强大和有用的工具我们真正的能把它学懂学透的话还是需要下非常大的功夫和努力的。然而,不是说兴趣才是最大的老师嘛,我也相信,只要你自己有兴趣,即使它再怎么强大和难搞,我们能做的还是非常多的,关键的就只是在于你自己的态度了。我这里想说的事,MATLAB对于我来说是非常有吸引力的,我不敢说自己多么喜欢它,但是兴趣确实蛮高的,所以我相信在以后的学习和工作当中MATLAB将成为我非常有用的帮忙工具和好伙伴,也许这要说有点太草率了,但是我觉得对它的评价怎么也不会让每一个接触过它的人吝啬是自己赞美之词。它不仅仅可以用来建模分析函数,还可以用来进行图形的建模和仿真,还可以用来分析系统和函数的参数稳定性等等。 clear all; load('Hsoa2ib2.mat') Hsoa2ib2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsoa2ib1.mat') Hsoa2ib1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsoa1ib2.mat') Hsoa1ib2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsoa1ib1.mat') Hsoa1ib1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hscb2cb2.mat') Hscb2cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hscb2cb1.mat') Hscb2cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hscb1cb2.mat') Hscb1cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hscb1cb1.mat') Hscb1cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca2cb2.mat') Hsca2cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca2cb1.mat') Hsca2cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca2ca2.mat') Hsca2ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca2ca1.mat') Hsca2ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca1cb2.mat') Hsca1cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca1cb1.mat') Hsca1cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca1ca2.mat') Hsca1ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hsca1ca1.mat') Hsca1ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hoa2ca2.mat') Hoa2ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hoa2ca1.mat') Hoa2ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hoa1ca2.mat') Hoa1ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hoa1ca1.mat') Hoa1ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb2ib2.mat') Hcb2ib2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb2ib1.mat') Hcb2ib1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb2cb2.mat') Hcb2cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb2cb1.mat') Hcb2cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb1ib2.mat') Hcb1ib2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb1ib1.mat') Hcb1ib1=(a4+1i*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb1cb2.mat') Hcb1cb2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hcb1cb1.mat') Hcb1cb1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hca2ca2.mat') Hca2ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hca2ca1.mat') Hca2ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hca1ca2.mat') Hca1ca2=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8;load('Hca1ca1.mat') Hca1ca1=(a4+j*a5);f=a0;clear a0a1a2a3a4a5a6a7a8; for k=2:401;w=2*pi*f [Hcaca]=[Hca1ca1(k),Hca1ca2(k);Hca2ca1(k),Hca2ca2(k)]/(-w(k)^2);[Hcbcb]=[Hcb1cb1(k),Hcb1cb2(k);Hcb2cb1(k),Hcb2cb2(k)]/(-w(k)^2);[Hcbib]=[Hcb1ib1(k),Hcb1ib2(k);Hcb2ib1(k),Hcb2ib2(k)]/(-w(k)^2);[Hoaca]=[Hoa1ca1(k),Hoa1ca2(k);Hoa2ca1(k),Hoa2ca2(k)]/(-w(k)^2); [Hscaca]=[Hsca1ca1(k),Hsca1ca2(k);Hsca2ca1(k),Hsca2ca2(k)]/(-w(k)^2); [Hscacb]=[Hsca1cb1(k),Hsca1cb2(k);Hsca2cb1(k),Hsca2cb2(k)]/(-w(k)^2); [Hscbcb]=[Hscb1cb1(k),Hscb1cb2(k);Hscb2cb1(k),Hscb2cb2(k)]/(-w(k)^2); [Hsoaib]=[Hsoa1ib1(k),Hsoa1ib2(k);Hsoa2ib1(k),Hsoa2ib2(k)]/(-w(k)^2);KsD=inv(Hscaca*transpose(inv(Hscacb))*Hscbcb-Hscacb);Ks11D(k)=KsD(1,1);Ks22D(k)=KsD(2,2); KsP=inv(Hcbib*inv(Hsoaib)*Hoaca-Hcaca-Hcbcb);Ks11P(k)=KsP(1,1);Ks22P(k)=KsP(2,2); Ks11(k)=197800+j*w(k)*1344.2;Ks22(k)=189300+j*w(k)*1625.4;end subplot(2,1,1); semilogy(f,abs(Ks11D),'--r',f,abs(Ks11P),'-y',f,abs(Ks11),':b');subplot(2,1,2); semilogy(f,abs(Ks22D),'--r',f,abs(Ks22P),'-y',f,abs(Ks22),':b');grid on,xlabel('频率'),ylabel('动刚度'),title('半对数频谱图'),legend('直接法','间接法','测量法'); 实验一 仿真条件:电机空载下,输入为阶跃信号,仿真时间为0.4S。 阶跃信号,仿真时间为0.4S。 图二 磁链图 实验结果:开始时有摩擦转矩,在短时间内能够快速形成圆形转矩。 图1 速度响应曲线 实际结果:时间与电机负载转矩为0时的电机响应速度曲线,速度响应误差为0。 仿真条件:电机空载下,输入为 仿真条件:d轴电流设置为0,输入为阶跃信号,电机空载运行响应时间为0.4秒。 图三 速度电流响应曲线 实际结果:在0.02秒时间达到目标转速,iq达到稳定。 实验三 实验目的:验证比列系数对稳态跟踪误差的影响。 仿真条件:修改KVFF为0,KAFF为0,负载为0,KPP为169,KPD为200.8,kpi为0 图四 速度 EP的响应曲线 试验目的:验证比例系数对稳态跟踪误差的关系ESS=V/K稳态跟踪误差越来越小。 仿真条件:修改KVFF为0,KAFF为0,负载为0,KPP为500,KPD为200.8,kpi为0。 图五 速度 EP的响应曲线 试验目的:验证比例系数对稳态跟踪误差的关系。 仿真条件:修改KVFF为0,KAFF为0,负载为0,KPP为5000,KPD为200.8,kpi为0。 图六 速度 EP的响应曲线 实验结果:Ep=V/K,随着K的增加,V不变,EP渐渐减小,前馈=1,完全补偿误差,稳定位置跟踪误差=0.试验目的:修改前馈系数观察稳态跟踪误差关系。 仿真条件:使KVFF为0.5电机负载为0使电机的摩擦系数为0。 图七 速度 EP的响应曲线 试验结论:修改前馈系数观察稳态跟踪误差关系。仿真条件:使KVFF为1电机负载为0使电机的摩擦系数为0。 图八 速度 EP的响应曲线 实验结果:由稳态跟踪误差=速度/比列系数(ess=v/k)得,比列系数越大,速度不变,稳态跟踪误差越大。 实验二 条件:电流给定信号(iq=500HZF方波),Id=0。电机的摩擦系数为无穷大,看Iq的响应波形。 实验结果:电机的摩擦系数为1000时,TL会反向转动。 条件:电流环达到速度环输出,还原参数速度还比列信号改成正弦波,继续增加频率。 正弦波频率为100HZ 正弦波频率为200HZ 正弦波频率为500HZ 正弦波频率为700HZ 实验四 实验条件:建立一个直流电机单速度闭环调节器。 1.求f(x)=4x6-x+x3-95在(0,100)上最大值、最小值,根。(使用函数fminbnd、roots) >>[x,y]=fminbnd('4*x.^6-x+x.^3-95',0,100)x = 0.4432 y = -95.3258 >> [x,y]=fminbnd('-4*x.^6+x-x.^3+95',0,100)x = 99.9999 y =-4.0000e+012 >> a=[4 0 0 1 0-1-95];roots(a)ans = 1.6860 0.8525 + 1.4852i 0.85251.4514i 求解常微分方程x’’=-x’+x+1,x’(0)=1,x(0)=0(使用函数dsolve)dsolve('D2x=-Dx+x+1','Dx(0)=1','x(0)=0')ans =(5^(1/2)*exp(t*(5^(1/2)/23))/(10*exp(t*(5^(1/2)/2 + 1/2)))1/3 + 1/51/11 +...)其中 n 为函式的输入,级数和 f(n)则是函式的输出。此外,你必须进行下列事项: function f=pifun(n)l=1;s=0;for i=1:n s=s+l/(2*i-1);l=-l;end s=4*s;disp('f(n)的值是');disp(num2str(s))(1)使用 tic 和 toc 指令来测量 pifun(100000)的计算时间。如果你不知道如何使用这两个指令,请使用 help tic 及 help toc 来查出它们的用法。我的计算机是 Pentium-450,所得的计算时间约为 2 秒。请说明你的计算机规格以及其计算时间。 >> tic,pifun(100000),toc f(n)的值是 3.1416 Elapsed time is 0.028928 seconds.Cpu Pentium dual—core e5300(2)使用 flops 指令来测量 pifun(100000)所用到 floating point operations 的计算次数。如果你不知道如何使用这个指令,请使用 help flops 来查出它的用法。 14、写一个 MATLAB 的递归函式 fibo.m 来计算 Fibonacci 数列,其定义如下: fibo(n+2)= fibo(n+1)+fibo(n)此数列的启始条件如下: fibo(1)= 0, fibo(2)= 1.function f=fibo(n)if n==1 f=0;elseif n==2 f=1;else f=fibo(n-1)+fibo(n-2);end 求下列函数的极小点: 1)fXx24x29x22x18x; 12312>> f='x(1)^2+4*x(2)^2+9*x(3)^2-2*x(1)+18*x(2)';[x,fm]=fminsearch(f,[0,0,0])x = 1.0000-2.2500 0.0000 fm = -21.2500 2) fX2x1; 32x22x1x2x12x22>> f='x(1)^2+3/2*x(2)^2-2*x(1)*x(2)+x(1)-2*x(2)';[x,fm]=fminsearch(f,[0,0]) x = 0.*** 1.*** fm = -0.*** 3)fXx1422.12>> f='(x(1)-1)^4+x(2)^2';>> [x,fm]=fminsearch(f,[0;1])x = 0.***-0.*** fm = 4.24***82e-017 第1),2)题的初始点可任意选取,第3)题的初始点取为X00,1T.5x1x2x31x3xx23416. 解线性方程组 1并求系数矩阵的行列式。 x1x25x432x34x41 a=[5 1-1 0 1;1 0 3-1 2;-1-1 0 5 3;0 0 2 4-1];>> rref(a) ans = 1.0000 0 0 0 1.4000 0 1.0000 0 0 -5.9000 0 0 1.0000 0 0.1000 0 0 0 1.0000 -0.3000 所以 x1=1.4;x2=-5.9;x3=0.1;x4=-0.3 a=[5 1-1 0;1 0 3-1;-1-1 0 5;0 0 2 4];>> det(a) ans = 2f17. 设 f(x,y)= 4 sin(x y),求 xy 3x2,y3 syms f s y;syms f x y;f=4*sin(x.^3*y);z=diff(diff(f,x),y);x=2;y=3;subs(z) >> zs17 ans = 1.0636e+003 18.求方程 3x4+4x3-20x+5 = 0 的所有解。 c=[3 4 0-20 5];roots(c) >> zs18 ans = -1.5003 + 1.5470i-1.50031.0860i 1.9536 + 1.0860i 1.0727 r = 8.6397e+003 即在第108年停产可获最大利润,最大利润为8639.7百万元。一幢楼房的后面是一个很大的花园。在花园中紧靠着楼房建有一个温室,温室高10英尺,延伸进花园7尺。清洁工要打扫温室上方的楼房的窗户。他只有借助于梯子,一头放在花园中,一头靠在楼房的墙上,攀援上去进行工作。他只有一架20米长的梯子,你认为他能否成功?能满足要求的梯子的最小长度是多少? 步骤: 1.先进行问题分析,明确问题; 2.建立模型,并运用Matlab函数求解; 3.对结果进行分析说明; 4.line)设计程序画出图形,对问题进行直观的分析和了解(主要用画线函数plot。若梯子能恰好放置,则梯子的长度f与倾角x关系如下: ab7f(x) (其中a=m, b=3.048m,0 L=inline('3.048/sin(x)+2.333/cos(x)','x');x=fminbnd(L,0.01,pi/2-0.01)l=subs(L) ezplot('3.048/sin(x)+2.333/cos(x)',[0,pi/2]) 由以上可知梯子的最小长度为7.59m。所以他能成功。 22.某大学青年教师从31岁开始建立自己的养老基金,他把已有的积蓄10000元也一次性地存入,已知月利率为0.001(以复利计),每月存入700元,试问当他60岁退休时,他的退休基金有多少?又若,他退休后每月要从银行提取1000元,试问多少年后他的基金将用完? function f=title22()s=10000;t=0;for i=1:360 s=s*(1+0.001)+700;end fprintf('60ËêÍËÐÝʱÍËÐÝ»ù½ðÓÐ%fÔª.n',s);while s>0 s=(s-1000)*(1+0.001);t=t+1;end t=ceil(t/12); fprintf('ÍËÐݺóÿÔÂÒª´ÓÒøÐÐÌáÈ¡1000Ôª£¬%dÄêºó»ù½ð½«ÓÃÍê.n',t);>> zs22 60岁退休时退休基金有317480.843330元.退休后每月要从银行提取1000元,32年后基金将用完.23.:请设计一个程序,程序完成下列功能:(1)让用户输入一个矩阵A;(2)在A中找出小于0的矩阵元素的位置;(3)在A中统计出等于0的元素的个数;(4)显示A的行数和列数; (5)找出矩阵A各元素中的最大值(显示值,不显示元素位置)。 function f=title20()a=input('ÇëÊäÈë¾ØÕóA: ');[m,n]=size(a);t=0;p=0;for i=1:m for j=1:n if a(i,j)<0 p=p+1; fprintf('µÚ%d¸öСÓÚ0µÄλÖÃÊÇ(%d,%d)n',p,i,j); end if a(i,j)==0 t=t+1; end end end B=a(:);max=B(1);for i=2:m*n if B(i)>max max=B(i); end end if p==0 disp('AÖÐûÓÐСÓÚ0µÄÔªËØ.');end fprintf('AÖеÈÓÚ0µÄÔªËصĸöÊýΪ%dn',t);fprintf('AµÄÐÐÊýºÍÁÐÊý·Ö±ðΪ%d£¬%dn',m,n);fprintf('A¸÷ÔªËØÖеÄ×î´óֵΪ%dn',max); 24:请设计一个程序,程序完成下列功能:(1)让用户依次输入两个字符串s1和s2;(2)比较两个字符串的长度并显示比较结果; (3)判断s1与s2有没有长度在3个字符以上的相同子串,显示判断结果。function f=title24() s1=input('ÇëÊäÈë×Ö·û´®s1: ');s2=input('ÇëÊäÈë×Ö·û´®s2: ');m=length(s1);n=length(s2);t=m;kk=0;if m>n t=n; disp('s1µÄ³¤¶È´óÓÚs2µÄ³¤¶È.');elseif m disp('s1µÄ³¤¶ÈСÓÚs2µÄ³¤¶È.');else disp('s1µÄ³¤¶ÈµÈÓÚs2µÄ³¤¶È.');end for i=4:t for j=1:m-i+1 for k=1:n-i+1 if strcmp(s1(j:j+i-1),s2(k:k+i-1))==1 l=0; for r=1:kk if strcmp(s1(j:j+i-1),b{r})==1 l=1; break;end end if l==0 kk=kk+1; b{kk}=s1(j:j+i-1); end end end end end for i=1:kk fprintf('µÚ%d¸öÏàͬ×Ö·û´®£º',i);disp(b{i}); end 25:编写程序模拟杨氏双缝干涉 两相干光源到接收屏上P点距离r1=(D2+(y-a/2)2)1/2, r2=(D2+(y+a/2)2)1/2,相位差 Φ=2π(r2-r1)/λ,光强I=4I0cos2(Φ/2)编写程序 clear lam=500e-9;a=2e-3;D=1;ym=5*lam*D/a;xs=ym;n=101;ys=linspace(-ym,ym,n);for i=1:n r1=sqrt((ys(i)-a/2).^2+D^2);r2=sqrt((ys(i)+a/2).^2+D^2);phi=2*pi*(r2-r1)./lam;B(i,:)=sum(4*cos(phi/2).^2);end N=255;Br=(B/4.0)*N;subplot(1,2,1);image(xs,ys,Br);colormap(gray(N));subplot(1,2,2);plot(B,ys); 26:编写程序模拟光栅衍射 公式:I=I0(sinα/α)2(sin(λβ)/sinβ)2 α=(πa/λ)sinΦ β=(πd/λ)sinΦ clear lam=500e-9;N=2;a=2e-4;D=5;d=5*a;ym=2*lam*D/a;xs=ym;n=1001;ys=linspace(-ym,ym,n);for i=1:n sinphi=ys(i)/D;alpha=pi*a*sinphi/lam;beta=pi*d*sinphi/lam; B(i,:)=(sin(alpha)./alpha).^2.*(sin(N*beta)./sin(beta)).^2;B1=B/max(B);end NC=255;Br=(B/max(B))*NC;subplot(1,2,1)image(xs,ys,Br);colormap(gray(NC));subplot(1,2,2)plot(B1,ys); 27:绘制三元函数wx2y2z2的可视化图形 x=-5:0.05:5;y=-5:0.05:5;z=-5:0.05:5;[x,y,z]=meshgrid(x,y,z);v=x.^2+y.^2+z.^2;isosurface(x,y,z,v,10);axis equal 28:绘制 zf(x,y)(1x)12ln(xy)的图象 [x,y,z,v] = flow; q=1./sqrt(1-x).*log(x-y)-z; p = patch(isosurface(x, y, z, v, 0));isonormals(x,y,z,q,p) set(p, 'FaceColor', 'blue', 'EdgeColor', 'none');view(3) camlight;lighting 29: 试完成matlab 动画 霓虹灯效果动画:一颗花心: clear;clc;close all c=5;t=linspace(-c,c);[x,y]=meshgrid(t);z=17*x.^2-16*abs(x).*y+17*y.^2-225;pcolor(x,y,z);shading interp pause(2);spinmap(10) 30:试完成matlab gui程序 function varargout = ex0(varargin)gui_Singleton = 1; gui_State = struct('gui_Name', mfilename,...'gui_Singleton', gui_Singleton,...'gui_OpeningFcn', @ex0_OpeningFcn,...'gui_OutputFcn', @ex0_OutputFcn,...'gui_LayoutFcn', [] ,...'gui_Callback', []);if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1});end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else gui_mainfcn(gui_State, varargin{:});end function ex0_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; global i a i=0; a=floor(100*rand); guidata(hObject, handles); function varargout = ex0_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function x1_Callback(hObject, eventdata, handles) function x1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end function x2_Callback(hObject, eventdata, handles) function x2_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end function p1_Callback(hObject, eventdata, handles) global i a x1= eval(get(handles.x1,'String')); if x1>a x2='high'; set(handles.x2,'string',num2str(x2));第二篇:Matlab实践报告
第三篇:MATLAB上机实践报告
第四篇:Matlab实习报告
第五篇:matlab实习报告(最新)