matlab基本用法小结.doc_第1页
matlab基本用法小结.doc_第2页
matlab基本用法小结.doc_第3页
matlab基本用法小结.doc_第4页
matlab基本用法小结.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Matlab基本用法小结一、说明2二、数据类型及基本输入输出41、数据类型,声明及赋初值42、基本输入输出5三、流程控制61、运算符62、IF63、switch-case结构74、try-catch结构8四、循环81、while82、for9五、数组、数组运算和矩阵运算91、 数值数组92、数组运算和矩阵运算113、逻辑数组154、字符串数组155、元胞数组166、构架数组177、空数组18六、M脚本文件和M函数文件、函数句柄181、matlab script file:182、matlab function193.函数句柄的使用21七、文件22八、数据和函数的可视化221二维数据的可视化222三维数据的可视化243图像控制命令25九、独立的回调函数26一、说明看了奚啸翔同学写的Fortran基本用法小结后觉得Fortran的语法既有matlab的特色也有C的特色。于是就套用了奚啸翔同学文章的格式,写了这篇matlab基本用法小结。目的是想和Fortran的语法有个对比,学起来更快。其实学过C、Fortran和matlab中任何一个的同学要学其他两种语言的语法都是非常容易上手的,一天就能搞定了。有兴趣的同学还可以看看百合Fortran版上的C、Fortran、matlab语法对比,一定能有不少收获。此外,尽管这三种语言的语法有很多相近的地方,matlab作为数学软件有其强大的图形用户界面操作、数据和函数的可视化和数值计算功能,且自带很多现有的函数和工具包。而本文只涉及一些比较系统的基本操作,在最后附带介绍一些基本的数据和函数的可视化命令。建议要用的时候再利用matlab自带的帮助文档来搜索有用的函数和工具包。matlab的函数和命令都是比较人性化的,比如想要搜索读取fits文件的函数,搜索fits就能够搜到fitsread函数;需要将读出的fits数据重新做图,搜索image就可以找到imagesc函数。从书和别人的文档都只能学到有限的比较系统的操作,看帮助文档能发现更多的东西并整理出自己的使用方法。最后要说明的是,C必须用循环才能做到的事情Fortran和matlab用矩阵和数组运算就能做到,相对效率提高了很多;而对于一些运算量非常大的程序还是推荐用Fortran,因为相比之下matlab的运算速度比Fortran慢很多;而网上很多现有的天文软件包都是用fortran写的(比如由宇宙学参数计算模拟数据的CAMB程序和宇宙模型可能性预测LIKELIHOOD程序),虽然matlab也有很多天文软件包,但相对fortran还是逊色不少。二、数据类型及基本输入输出1、数据类型,声明及赋初值matlab中存储的数据类型(class)有以下几种:而实际上matlab不需要对变量做声明,当它发现一个新的变量名时,将默认将其为双精度浮点类型(double)并分配内存空间。(这比C和 Fortran方便了许多,但在完成大运算量的程序时就显得浪费存储空间了)当需要把变量a从double转为其他类型的时候,比如要转为int16型,可以使用以下命令:a=int16(a)当需要创建一个字符型变量x并对其赋初值时,用以下格式:x=字符串;注意:(1)在命令后加“;”表示不在command window中显示结果,而对上例来说如果不加“;”则会显示所赋字符串内容。(2)所有的命令必须在英文输入状态下,如果使用中文输入状态下全角的“;”,将被处理为非法字符。其中logical,cell和structure为逻辑,元胞和构架数组类型,将在后面的数组部分提到;function handle为函数句柄类型,将在后面的“M脚本文件和M函数文件、函数句柄”部分提到;java类供JAVA API应用程序接口使用,本文不进行说明。最后说明一下,matlab也支持复数操作,赋值的时候直接输入即可,比如:a=1+2i;2、基本输入输出输入:v=input(message) %将用户输入的内容赋给变量vv=input(message,s) %将用户输入的内容作为字符串赋给变量vkeyboard %用户可以从键盘输入任意多个指令v=yesinput(prompt,default,possib)%prompt为文字提示,default为缺省设置“值”,possib为设置值的范围。%该指令无法在notebook中运行。输出:disp(a) %显示变量a的内容,另一种显示变量内容的方法是输入变量名,但是这样显示的结果带有“a=”。三、流程控制1、运算符(1)关系操作符= = = 0.5) %由大于0.5的元素构成的子数组(3)对二维数值数组赋初值逐个赋值:x=1,2,3; 3,4,6; 7,8,9 %“;”为二维数组“行”的分隔符号,而“,”和空格为同一行元素的分隔符。整列赋值:x(:,4,5)=4 %第4、5列赋值为4元素重排:A=reshape(1:9,3,3) %将1到9重新排列成一个(3*3)矩阵,注意matlab是列“优先”,即先排第一列再排第二列,而不是按行来排。(4)二维数组元素的标识和寻访“全下标”标识:A(3,5) %第3行第5列元素“单下标”标识:对于一个(m*n)维数组A中第r行第c列元素,其“单下标”表示为:A(l)%这里l=(c-1)*m+r2、数组运算和矩阵运算(1)数组运算指令含义A.相当于conj(A),conj的作用help一下吧A=s把标量s赋给A的每个元素s+B标量s分别与B元素之和s-B,B-s标量s分别与B元素之差s.*A标量s分别与A元素之积s./B,B.ss分别被B的元素除A.nA的每个元素自乘n次A.p对A的各个元素分别求非整数幂p.A以p为底,分别以A的元素为指数求幂A+B对应元素相加A-B对应元素相减A.*B对应元素相乘A./BA的元素被B的对应元素除B.A同上exp(A)以e为底,分别以A的元素为指数求幂log(A)对A的各个元素求对数sqrt(A)对A的各个元素求平方根f(A)求A各个元素的函数值A#B对应元素的关系运算,#代表关系运算符AB对应元素的逻辑运算,代表逻辑运算符(2)矩阵运算指令含义A共轭转置s*A标量s分别与A元素之积S*inv(B)B阵的逆乘sAnA阵为方阵时,自乘n次Ap方阵A的非整数乘方pAA阵为方阵时,标量的矩阵乘方A+B矩阵相加A-B矩阵相减A*B矩阵相乘A/BA右除BBAA左除Bexpm(A)A的矩阵指数函数logm(A)A的矩阵对数函数sqrtm(A)A的矩阵平方根函数funm(A,FN)一般矩阵函数3、逻辑数组看例子就明白了:A=zeros(2,5); %预生成一个(2*5)全零数组A(:)=-4:5; %运用“全元素”方法向A赋值L=abs(A)3 %产生一个与A同维的“0 -1”逻辑值数组islogical(L) %判断L是否逻辑值数组。输出若为1,则是X=A(L) %把L中逻辑值为1对应的A元素取出4、字符串数组(1)字符串数组赋初值S=aabb或者:S=char(aa,bb)还可以:S=str2mat(aa, ,bb) %这里空串会产生空行而:S=str2cat(aa, ,bb) %这里空串不会产生空行(2) 字符串操作函数int2str %把整数数组转换为串数组num2str %把非整数数组转换为串数组mat2str %把数值数组转换为串数组%请使用help搜索其他的字符串操作函数。5、元胞数组元胞数组和一般数值数组和字符串数组不同,其元素可以是任意类型和大小的对象。这和C的结构型数组有些类似。(1)创建元胞数组有以下两种创建方式:外标识元素赋值:a=char(aa bb);b=1:9;c=2:5;d=1+2i;A(1,1)=a; A(1,2)=b; A(2,1)=c; A(2,2)=d;内涵的直接赋值:a=char(aa bb);b=1:9;c=2:5;d=1+2i;A1,1=a; A1,2=b; A2,1=c; A2,2=d;(2)元胞数组内容的调取注意在这里()访问的是元胞,用访问的是元胞中存储的内容。比如:a=A(1,1)显示:a=12 char而:a=A1,1显示:a=aabb所以用而不是()调取元胞数组内容。6、构架数组构架数组和元胞数组类似,但其每个构架(地位相当于元胞数组的元胞)必须划分“域”后才能使用。看下面的例子:green_house(2,3).name=六号房;green_house(2,3).param.temperature=30;green_house(2,3).param.humidity=10;green_house屏幕显示:23 struct array with fields:nameparam注意:(1)在一个构架上进行的增减域的操作会影响到整个数组。(2)增减子域不会影响到其他构架。7、空数组(1)有下面几种产生空数组的方法:a= b=ones(2,0) %ones的作用原本是产生一个全1的数组c=zeros(2,0) %zeros的作用原本是产生一个全0的数组d=eye(2,0) %eye的作用原本是产生一个对角元全为1的数组f=rand(2,3,0,4) %rand的作用原本是产生随即数组。(2)空数组可用于子数组的删除和数组大小的收缩A(:,2)=六、M脚本文件和M函数文件、函数句柄m文件分两种:函数和脚本。1、matlab script file:脚本文件没有输入输出,对工作空间(workspace)中的变量进行操作。任何可执行的matlab命令都可以写入脚本文件。先来看一个简单的例子:例1: 产生一个20元素的一维随机数组并画出。解: 新建一个m文件命名为randplt.m(或者任何你喜欢的名字), 在其中加入如下两行代码:data=randn(1,20); plot(data);保存后选择debug/run菜单或按F5键运行,观察workspace中多出了一个变量data。脚本文件执行时, 就如同将文件中的每一条命令依次输入到matlab命令行中一样, 顺次执行。你可以尝试在command history窗口中按住ctrl键选择几行执行过的命令并单击鼠标右键在快捷菜单中选择creat M file来快速创建一个m文件。2、matlab function函数文件可以接受输入和给出输出,当然也可以没有,就像c语言的函数。matlab函数最大的书写特点(同C比起来)是它的输出变量定义在函数名前面。看一例:例2: matlab内部函数std给出数组的标准差std=sqrt(sum(X)/N),编写函数stderr求实验误差err=sqrt(sum(X)/(N*(N-1), 代码如下:function err=stderr(arr)%实验误差(标准差估计)%caculate along each column of arrerr=std(arr)./sqrt(size(arr,1)-1);文件存为stderr.m, 运行时输入a=1;2;3;建立一个列数组a, 然后输入stderr(a)则给出a的方差。(若输入行数组则发散,因N-1=0)此例中输入变量为arr, 函数名为stderr, 输出变量err, 此三者皆写在关键字function后面同一行。无需再使用return将err的值返回。注意:(1)函数文件的命名要使用文件内主函数声明的名称,否则出错。(2)函数内部可以嵌套子函数并为该文件的主函数调用,只需将子函数写在主函数代码后面。(3)一个函数可以有多个输入输出。如function y1,y2=myfun(x1,x2,x3)例1中的m文件可在第一行前插入一行:function randplt保存后则该文件成为一个没有输入输出宗量的函数。一般来说matlab中执行同样的任务使用函数文件比脚本文件的效率高。3.函数句柄的使用函数句柄起到c语言中函数指针的作用。例3: 编写函数求出数组arr1和arr2的标准差(std)以及误差(stderr)。解: 编写如下文件并保存为erreval.mfunction s1,s2=erreval(err,arr1,arr2)% err为所调用的误差函数,s1,s2分别返回arr1和arr2的误差.s1=feval(err,arr1);s2=feval(err,arr2);此文件的输入包含函数变量, 通过函数句柄实现函数变量err的赋值。运行时先运行如下命令建立数组arr1,arr2:arr1=1;2;3;arr2=10;20;30;然后输入std1,std2=erreval(std,arr1,arr2)stderr1,stderr2=erreval(stderr,arr1,arr2)执行后返回四个误差值。std,stderr为两误差函数的函数句柄。七、文件打开文件:fid = fopen(filename,permission)%其中的permission为打开类型,具体可查阅matlab的帮助文档。读文件:A,count = fread(fid,size,precision)%A 为存放读入数据的变量。%count 为可选参数,存放成功读取的数据个数。%fid 为文件指针。%size 为要求读入的数据量大小,缺省状态下读到文件末尾。%presision 为读出数据格式。写文件:count = fwrite(fid,A,precision)八、数据和函数的可视化图像的精细控制大有文章可做,这里只介绍一些做图最常用的基本命令。1二维数据的可视化设x,y为两等长的一维数组,若要将x,y对应位置的元素做图,可使用以下命令:plot(x,y);如果使用:plot(x);就相当于:s=size(x);plot(x,1:s(2);我们可以对线型和色彩做控制,比如plot(x,y,.r)画出的是红色点线。线型和色彩控制值如下表:线型符号-:-.-含义实线虚线点划线双划线色彩符号bgrcmykw含义蓝绿红青品红黄黑白2三维数据的可视化plot3最容易理解:plot3(X,Y,Z);另外的两个基本命令是:mesh(X,Y,Z) %画网线图。mesh(Z) %以Z矩阵列行下标为x,y轴自变量画网线图。surf(X,Y,Z) %画曲面图。surf(Z) %以Z矩阵列行下标为x,y轴自变量画曲面图。3图像控制命令figure %打开新的作图窗口axis(0,pi,-1,1) %控制坐标轴的范围title(pic) %为图像增加标题grid on %显示坐标网格legend %显示图例hold on %在画下一幅图的时候,保留之前的图。hold off %停止保留之前的图。colorbar %显示颜色条box on %显示三维图的长方体边框%全文结束。九、独立的回调函数建立GUI函数的一个有效方法是编写独立的回调函数,专门执行一个或多个回调。函数使用档 对象句柄和其它变量可以作为参量传递,必要时回调函数可返回值。考虑先前的一个例子,建立一个方位角的滑标,以脚本文件来实现。% setview.m script filevw=get(gca, View );Hc_az=uicontrol(gcf, Style , slider ,. Position ,10 5 140 20,. Min ,-90, Max ,90, Value ,vw(1),. Callback ,. set(Hc_cur, String ,num2str(get(Hc_az, Value ), . set(gca, View ,get(Hc_az, Value ) vw(2) )Hc_min=uicontrol(gcf, style , text ,. Position ,10 25 40 20,. String ,num2str(get(Hc_az, Min );Hc_max=uicontrol(gcf, Style , text ,. Position ,110 25 40 20,. String ,num2str(get(Hc_az, Max );Hc_cur=uicontrol(gcf, Style , text ,. Position ,60 25 40 20,. String ,num2str(get(Hc_az, Value );下面是同样的例子。作为一个函数,采用 Tag 属性来辨别控制框,并使用独立的M文件件来执行回调funtion setview( )vw=get(gca, View );Hc_az=uicontrol(gcf, Style , Slider ,. Position ,10 5 140 20,. Min ,-90, Max ,90, Value ,vw(1),. Tag , Azslider ,. Callback , svcback );Hc_min=uicontrol(gcf, style , text,. Position ,10 25 40 20,. String ,num2str(get(Hc_az, Min );Hc_max=uicontrol(gcf, Style , text ,. Position ,110 25 40 20,. String ,num2str(get(Hc_az, Max );Hc_cur=uicontrol(gcf, Style , text ,. Position ,60 25 40 20,. Tag , Azcur ,. String ,num2str(get(Hc_az, Value );回调函数本身如下:function svcback( )vw = get(gca, View );Hc_az = findobj(gcf, Tag , AZslider );Hc_cur = findobj(gcf, Tag , AZcur );str = num2str(get(Hc_az, Value );newview =get(Hc_az, Value ) vw(2);set(Hc_cur, String ,str)set(gca, View ,newview)上面的例子并不节省很多代码,但却得到了用函数而不用脚本文件的优点:回调函数可以利利用临时变量,而不使命令窗口工作空间拥挤;不需要eval所需的引号和字符串;在回调函数中命令的句法变得十分简单。使用独立回调函数技术,越复杂的回调(函数)越简单独立回调函数的缺点是:需要很大数目的M文件以实现一个含有若干控制框和菜单项的GUI函函数,所有这些M文件必须在MATLAB路径中可得,且每一个文件又必须要有一个不同的文件名。在对文件名大小有限制且对大小写不敏感的平台上,如MS-windows,文件冲突的机会就增加了。而且回函数只能被GUI函数调用而不能被用户调用。递归函数调用利用单独的M文件并递归地调用该文件,既可以避免多个M文件的复杂性,又可以利用函数的的优点。使用开关 switches或if elseif语句,可将回调函数装入调用函数内。通常这样一种函数调用的结构function guifunc(switch)。其中switch确定执行哪一个函数开关的参量,它可以是字符串 startup , close , sectolor 等等,也可以是代码或数字。如switch是字符串,则可如下面所示的M文件片段那样将开关编程。if nargin 1, switch = startup ; end;if isstr(switch), error( Invalid argument ), end;if strcmp(switch, startup ),elseif strcmp(switch, setcolor ),elseif strcmp(switch, close ),end如果是代码或字符串,开关也可以相同方式编程。if nargin 1, switch = 0; end;if isstr(switch), error( Invalid argument ), end;if switch = = 0,elseif switch = =1,elseif switch =2,end下面的例子说明了方位角滑标如何可作为单独的函数M文件来实现:function setview(switch)if nargin 1, switch = startup ; end;if isstr(switch), error( Invalid argument. ); end;vw = get(gca, view ); % This information is needed in both sectionsif strcmp(switch, startup ) % Define the controls and tag themHc_az = uicontrol(gcf, Style , slider ,. Position ,10 5 140 20,. Min ,-90, Max ,90, Value vw(1),. Tag , AZslider ,. Callback , setview( set ) );Hc_min=uicontrol(gcf, Style , text ,. Position ,10 25 40 20,. String ,num2str(get(Hc_az, Min );Hc_max = uicontrol(gcf, Style , text ,. Position ,110 25 40 20,. String ,num2str(get(Hc_az, Max );Hc_cur =uicontrol(gcf, Style , text ,. Position ,60 25 40 20,. Tag , AZcur ,. string ,num2str(get(Hc_az, Value );elseif strcmp(switch, set ) % Execute the CallbackHc_az=findobj(gcf, Tag , AZslider );Hc_cur-findobj(gcf, Tag , AZcur );str = num2str(get(Hc_az, Value );newview - get(Hc_az, Value ) vw(2);set(Hc_cur, String , str)set(gca, View ,newview)end上述的两个例子均设置了 tag 属性,利用该属性和函数findobj寻找回调函数所需对象象的句柄。另外两种方法将在下章描述全局变量全局变量可用在函数中,使某些变量对GUI函数的所有部分都可用,全局变量是在函数的公构 区说明,因此整个函数以及 有对函数的递归调用都可以利用全局变量,下面的例子说明如何利用全局变量将方位角滑标编程。function setview(switch)global HC_AZ HC_CUR % Create global variablesif nargin clear global,则所有全局变量则都被破坏,包括在函数内定义的那些变量当单独的一个图形或有限个变量要被所有的回调(函数)利用时,全局变量使用和递归性函数数调用都是有效的技术。对于包含多个图形的更复杂的函数,或用独立对象回调函数实现的情况, UserData 属性更合适。另外,只要可获得对象句柄,对象 UserData 的属性值在命令窗口工作空间中是存在的。用户数据属性同属性 Tag 一样, UserData 属性可在函数之间或递归函数的不同部分之间传递 信息。如果需要多个变量,这些变量可以在一个容易辨识的对象的属性 UsetData 中传递。如前面所述, 对与句柄图形对象在一起的单个数据矩阵 UserData 提供了存储。下面的程序利用了当前图形的 UserData 属性来实现方位角滑标。function setview(switch)if nargin 180, CVIEW(1)=CVIEW(1)-(360*sign(CVIEW(1);endset(Hf_fig, DefaultUicontrolUnits , normalized );%-% Define azimuth and elevation sliders.% The position is in normalized units (0-1).% Maximum, minimum, and initial values are set.%-Hc_asli=uicontrol(Hf_fig, style , slider ,. position ,.09 .02 .3 .05,. min ,-180, max ,180, value , CVIEW(1),. callback , mmview3d(991) );Hc_esli=uicontrol(Hf_fig, style , slider ,. position;,.92 .5 .04 .42,. min ,-90, max ,90, val ,CVIEW(2),. callback , mmview3d(992) );%-% Place the text boxes showing the minimum and maximum values at the% ends of each slider, These are text displays, and cannot be edited.%-uicontrol(Hf_fig, style , text ,. pos ,.02 .02 .07 .05,. string ,num2str(get(Hc_asli, min );uicontrol(Hf_fig, style , text ,. pos ,.39 .02 .07 .05,. string ,num2str(get(Hc_esli, min );uicontrol(Hf_fig, style , text ,. pos ,.915 .92 .05 .05,. string ,num2str(get(Hc_esli, max );%-% Place labels for each slider%-uicontrol(Hf_fig, style , text ,. pos ,9.095 .08 .15 .05,. string , Azimuth );uicontrol(Hf_fig, style , text ,. pos ,.885 .39 .11 .05,. string , Elevation );%-sitionMMCXY_OUT=cp(1,1:2);xystr=sprintf( %.3g ,MMCXY_OUT);Hu=get(gcf, Userdata );set(Hu, String xystr) % put x-y coordinaates in text boxelseif strcmp(arg, end ) % mouse click occurred, clean things upHu=get(gcf, Userdata );set(Hu, visible , off ) % make sure text box disappearsdelete(Hu)set(gcf, Pointer , arrow ,. WindowButtonMotionFcn , ,. WindowButtonDownFcn , ,. Userdata ,)end第一次被调用时,mmcxy建立文本uicontrol,改变指针形状,设定 WindowButtonDownFcnn 和 WindowButtonMotionFcn 的回调,然后等待按键或先揿按钮。若有键揿下,就调用清除(cleanup)程序,清除文本框,恢复鼠标指针,清除图形回调及 UserData 属性。若点击鼠标按钮, WindowButtonDownFcn 回调就处理清除任务。在等待时,图行 中鼠标指针的移动会触发 WindowButtonMotionFcn 回调,更新uicontro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论