admin 管理员组文章数量: 1086019
2024年5月15日发(作者:list里值的比较)
Matlab语言的学习总结
内容提要 Matlab是美国MathWorks公司于1984年正式推出的一套高性能
的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图形显
示于一体,构成了一个方便且界面友好的用户环境。在此环境下,对所要解决
的许多问题,用户只需简单地列出数学表达式,其结果便会以数值和图形方式
显示出来;对于大型问题,只需建立相应的数学模型,同样可以得到快速准确
的解答。Matlab以其强大灵活的分析平台,多种兼容的数据类型,简化处理数
据的函数,快速而又精确的数据分析函数以及丰富的图形和自动文档生成能力
赢得了越来越多的用户的青睐,尤其是在校大学生的追捧,目前广泛工程运算,
控制系统设计图形处理等领域。本文将通过简介Matlab强大的数值计算功能与
数据可视化功能,阐述本人在使用Matlab进行程序设计中的几则经验,并谈谈
学习Matlab的一些体会。
关键词
Matlab、数值计算、符号计算、可视化
语言及发展
Matlab是MATrix LABoratory(“矩阵实验室”)的缩写,是美国
MathWorks公司开发的集数值计算、符号计算和图形可视化三大基本功能于一
体的,功能强大、操作简单的语言,是国际公认的优秀数学应用软件之一。
20世纪80年代初期,Cleve Moler与John Little等利用C语言开发了新一
代的Matlab语言,此时的Matlab语言已同时具备了数值计算功能和简单的图
形处理功能。1984年,Cleve Moler与John Little等正式成立了Mathworks公司,
把Matlab语言推向市场,并开始了对Matlab工具箱等的开发设计。现在,
Matlab已经发展成为适合多学科的大型软件,在世界各高校,Matlab已经成为
线性代数、数值分析、数理统计、优化方法、自动控制、数字信号处理、动态
系统仿真等高级课程的基本教学工具。特别是最近几年,Matlab在我国大学生
数学建模竞赛中的应用,为参赛者在有限的时间内准确、有效的解决问题提供
了有力的保证。
2.强大的数值计算与符号计算功能
Matlab的数值计算功能包括:矩阵和向量的处理和运算、多项式和有理分
式运算、数据统计分析、数值积分、优化处理等。符号计算功能包括:符号变
量的微积分、表达式的简化、任意精度计算、调用Maple函数的方法等。
2.1数值计算功能
Matlab以矩阵为运算单元,除非特殊需要,矩阵不必事先定义维数大小。
Matlab还提供了丰富的矩阵运算函数,如求逆矩阵的inv函数,求方阵行列式
的det函数,求矩阵特征值及特征向量的eig函数等等。正因为如此,在矩阵运
算上,Matlab体现出比Basic、 Fortran、Pascal、C等语言要高得多的编程效率,
而且程序可读性强,调试简单,容易维护。许多含有矩阵运算的复杂的源程序
如果用Matlab编写,只要寥寥几行就可结束,就象在草稿纸上进行演算一样简
捷直观,故Matlab又被称为“演算纸式的程序设计语言”。
2.2符号计算功能
除了数值计算,Matlab4.0以上版本还提供了Basic、 Fortran、Pascal、C
等语言所没有的符号计算功能,当然你必须安装了符号计算工具箱。在数值计
算中,所有运作的变量都是被赋值的数值变量,而在符号计算中,所运作的都
是符号变量。在高等数学中的级数、微分、积分,甚至微分方程组通过Matlab
的符号计算工具箱都可以方便地求解。
3.强大的科学数据可视化功能
作为一个优秀的科技应用软件,Matlab不仅在数值计算方面无与伦比,而
且在数据可视化方面也有上佳表现。Matlab 有两个层次的绘图命令:一组是直
接对句柄进行操作的底层绘图指令;另一组是在底层指令基础上建立起来的高
层绘图指令。
3.1高层绘图指令实现默认的图形表现方式
用高层绘图指令可以实现Matlab中默认的图形表现方式,这些指令简单明
了,极易为用户掌握。例如调用plot函数可绘制直角坐标二维曲线,调用plot3
函数可绘制直角坐标三维曲线。另外还有其他许多简便的高层绘图指令,可用
于绘制一些特殊的平面图形(如统计频数直方图),实现对图的注释等等。
3.2底层绘图指令更改图形属性
如果用户对默认的图形表现方式不甚满意,可用底层绘图指令如set函数更
改图形句柄对象的属性。例如可以更改图形窗口的背景色,轴的位置,纵横轴
的比例,绘图的线型、线宽等。
3.3符号函数的可视化
对于符号函数,Matlab也可简便地实现可视化。定义符号函数后,调用
ezplot函数即可绘制符号函数的曲线,而且图名及横坐标名都将自动生成。
程序设计经验
在使用Matlab编程时,若要利用现成的Fortran或 C的软件包,常会遇到
接口问题。通常可采用以下几种方法:
在Matlab的M文件中调用由Fortran或 C子程序编译生成的MEX可执行
文件,此法将降低Matlab的执行速度。
用剪贴板将Fortran或 C产生的数据文件考贝到Matlab的M文件中。此法
虽然简单,但若遇到大型质量矩阵或刚度矩阵,将使源程序冗长。
用fopen 、fread 、fscanf 等Matlab的底层I/O指令将Fortran或 C产生的
数据文件读入Matlab的M文件中。
用fscanf语句输入矩阵变量或简单变量的数值时,一句fscanf语句只能读
入一个变量(包括矩阵变量或简单变量)的数值,而在C语言中,一句fscanf
语句可以读入多个简单变量的数值。还要注意的是当用A=fscanf(FP,′%d′,1)读
入简单变量A的数值时,()内的′1′必不可少,否则该语句会将指针FP在所
对应的文本文件中当前所指的数据及其后所有的数据全部读入并赋给变量A,
使A成为一列向量。这是因为在Matlab中默认的基本数元为矩阵。
用循环语句对一列向量赋值时,例如要产生一个3×1的“0”矩阵A,应用:
for J=1:1:3 /A(J,1)=0.0; /end。若用:for J=1:1:3 / A(J)=0.0;/end (“/”表示回车键) ,
则A={0 0 0},产生的是一个1×3的矩阵,即行向量。在编程中若忽视了这个问
题常会造成数组的维数不匹配。
Matlab中严格区分大小写,当Command Window中遇到提示“Undefined
function or variable ′A′.”时,可检查一下是否错按了大小写字母切换键。
Matlab当中的指令用的都是英文标点,如果在中文之星或RichWin状态下
输入指令,要注意不要错用了中文标点,否则将给出出错信息。
Matlab 具有丰富的函数库,自己编写的函数应避免与Matlab函数库中的
函数同名,否则Matlab会优先执行函数库中的同名函数。
Matlab启动后的缺省目录是c:matlabbin,若不建立自己的工作目录,那
么在Matlab环境下所产生的数据文件以及用户自己编写的可执行文件就很可能
登录在这缺省目录上,造成用户文件与Matlab自身函数文件混杂在一起。因此
用户应在Dos环境或Windows环境下建立自己的工作目录,并将其设置为当前
工作目录。可用cd命令进入用户自己的工作目录。
假定用户用书写器(记事本或写字板等)编写好了一个m文件(Matlab中的可
执行文件),可用Command Window 中File 下拉菜单中的Run M-file选项来执
行该文件。或者先设置好该文件的搜索路径,然后在Command Window 中键
入该文件名,回车即可。设置搜索路径的方法除了上面中提到的cd命令外,还
可用path指令扩展搜索路径。或者在Matlabrc.m中添加该文件所在的路径,重
新启动Matlab使该搜索路径生效。需要注意的是用path指令扩展的搜索路径仅
在当前Matlab工作环境中有效,而在Matlabrc.m中添加的路径只要不被删除,
将永远有效。
虽然Matlab中提供了正无穷大变量Inf,但在数值积分中调用quad8积分
指令时若用+Inf或-Inf作为积分的上限或下限,将使结果成为不定值。请看下
面一个例子:
求标准正态分布的概率函数值
先用编辑器建立被积函数f.m文件。
function prob=f(x)
//函数文件以function作为文件头
prob=1/sqrt(2*pi)*exp(-(x.^2)/2);
//被积函数表达式
将写好的f.m文件存放在自己的工作目录中。当调用积分指令quad8
时,结果出现不定值NaN。
u=-1:0.5:1
//形成由-1到1,间隔为0.5的行向量
for I=1:1:5
P(I)=quad8(′f′,-Inf,u(I));
//f为被积函数文件名,-Inf、u(I)分别为积分的上、下限
end
结果如下:
u =-1.0000 -0.5000 0 0.5000 1.0000
P =NaN NaN NaN NaN NaN
其实只要采用一个小小的技巧就能求出标准正态分布的概率函数值。
注意到
改用如下程序即可得到正确的答案。
u=-1:0.5:1;
for I=1:1:5
P(I)=0.5-quad8(′f′,u(I),0);
end
结果如下:
P =0.1587 0.3085 0.5000 0.6915 0.8413
在符号微积分中用+Inf或-Inf作为积分的上限或下限能得到正确的解答,
但是计算的速度比用积分指令quad8慢得多。仍采用同一例子,程序如下:
prob=′1/sqrt(2*pi)*exp(-(x^2)/2)′;
//定义概率密度函数的符号函数
u=-1:0.5:1;
for I=1:1:5 %int对符号函数求积分,
//numeric将符号变量转化为数值变量
P(I)=numeric(int(prob,-Inf,u(I)));
end
P =0.1587 0.3085 0.5000 0.6915 0.8413
在符号表达式的变量替换中,不少Matlab的参考书都提到了subs指令,
并介了它的具体使用格式:subs(f,NEW,OLD),即用新字符串NEW代替符号表
达式f中的旧字符串OLD。事实上,当新字符串是数字字符时,或者新字符串
是字母字符且在表达式中未出现,用subs(f,NEW,OLD)与用subs(f,OLD,NEW)
的结果是一样的。请看如下例子:
新字符串是数字字符
f=′a*u^3+b*u^2+c*u+d′
//定义符号函数f
f1=subs(f,′a′,′3′)
//用′3′替换f中的′a′
f2=subs(f,′3′,′a′)
//用′3′替换f中的′a′
输出结果:
f =a*u^3+b*u^2+c*u+d
f1 =3*u^3+b*u^2+c*u+d
f2 =3*u^3+b*u^2+c*u+d
新字符串是字母字符且在符号表达式中未出现
f=′a*u^3+b*u^2+c*u+d′
//定义符号函数f
f1=subs(f,′s′,′u′)
//用′s′替换f中的′u′
f2=subs(f,′u′,′s′)
//用′s′替换f中的′u′
输出结果:
f =a*u^3+b*u^2+c*u+d
f1 =a*s^3+b*s^2+c*s+d
f2 =a*s^3+b*s^2+c*s+d
如果新字符串是字母字符且在符号表达式中有出现,则替换格式应为
subs(f,OLD,NEW)
f=′a*u^3+b*u^2+c*u+d′
f1=subs(f,′a′,′u′)
//用′u′替换f中的′a′
f2=subs(f,′u′,′a′)
//用′a′替换f中的′u′
输出结果:
f =a*u^3+b*u^2+c*u+d
f1 =u^4+b*u^2+c*u+d
f2 =a^4+b*a^2+c*a+d
5.结语
Matlab随着版本的不断升级,其功能也越来越完善,除了文中提到的符号
工具箱外,它还拥有控制系统、信号处理、优化、神经网络、模糊推理等专业
工具箱。Matlab及其工具箱将一个优秀软件包的易用性与可靠性,通用性与专
业性近乎完美地结合在一起,使其逐渐成为国际性的计算标准为世界各地的科
学家和工程师所广泛地采用。在西方,Matlab的应用已经遍及现代科学界和工
程界,各主要大学,政府研究部门和各大公司。相比之下,我国科技人员对其
的了解和应用就少得多了,Matlab强大的功能与先进的技术等待我们去发掘和
应用。
在科学界,无论一个人怎么会使用软件,怎么会拿来主义,如果不注重理
论修为,我想他她不会走得太远,而且还会受制于人。由Cleve Moler等人开
发的Matlab,无疑是现代科学工作者有力的帮手,这个软件也带来许多变化,
我不想再过多的评论,我想拥有这样的软件,许多本科生、硕士研究生、博士
研究生、工程师和教授……,会越来越离不开她的支持。君子善假于物也!工
科的朋友们,努力提高自己的理论水平,努力增强自己的操作能力,你将更能
体会到Matlab给你带来的乐趣!
最
后,我总结了自己学习Matlab语言的三点体会:
第一,基础。Matlab是类C的语言,学过C语言或者其他的编程语言更好,
没有也没事,我就是只有大一学的一点C++语言的编程基础,关键是决心。
第二,教材。我个人觉得是:要以学习课本为主,以其他教材资料为辅,
入门阶段最好找中文的。最近看到一本新版的Matlab7.0 从入门到精通,感觉
不错。关键还是尽快熟悉Matlab的界面及其使用方法,之后就别太指望书了。
因此,一定要尽快学会使用Matlab的Help……其实我觉得,Matlab的Help作
为辅助是最好的,其他的书不过是锦上添花。
第三,多想,多练。现在很多同学上Matlab课就是混,而且课后也不去复
习。我想,这样的学习态度和学习方式是学不到真东西的。人浮于事既骗了别
人,更骗了自己。所以我感觉,学Matlab一定要自己静下心来亲自去想,去练。
这样,自己不但可以学到真东西,还能激发你学习Matlab的兴趣。拿我本人来
说,在没学matlab之前,我做直方图的程序的时候为了画图要不停地调用
moveto和lineto,还要估计到直方图的效果。但是从算法上说其实是没什么东
西的,很简单。然而为了得到对口的东西不得不花费大量的时间,这样做我觉
得是很不值得的。所以,后来我尝试了将vc做出来的数据拿去让matlab分析,
发现省去了不小的麻烦。这就是我最初学习matlab的动力之所在。经过这一学
期的学习,我对matlab在总体上有了了解,虽然我没有接触到最核心的toolbox
的东西,但从getting started的文献中也学到了不少东西。比如基本的m文件的
编辑和调试,matlab和c,vc的交互,还有mcc的使用。虽然我现在对实现vc
和matlab联合编程的最有效的方法还是很模糊,不过我相信mcc是一种不错的
方法,而且matlab7.0对mcc做了很大的改动。
以此作为学习Matlab语言的总结。
特别声明:
1
:资料来源于互联网,版权归属原作者
2
:资料内容属于网络意见,与本账号立场无关
3
:如有侵权,请告知,立即删除。
版权声明:本文标题:Matlab语言的学习总结 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1715760873a688779.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论