matlab基本用法小结.docx

上传人:b****8 文档编号:11253951 上传时间:2023-02-26 格式:DOCX 页数:30 大小:29.76KB
下载 相关 举报
matlab基本用法小结.docx_第1页
第1页 / 共30页
matlab基本用法小结.docx_第2页
第2页 / 共30页
matlab基本用法小结.docx_第3页
第3页 / 共30页
matlab基本用法小结.docx_第4页
第4页 / 共30页
matlab基本用法小结.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

matlab基本用法小结.docx

《matlab基本用法小结.docx》由会员分享,可在线阅读,更多相关《matlab基本用法小结.docx(30页珍藏版)》请在冰豆网上搜索。

matlab基本用法小结.docx

matlab基本用法小结

Matlab基本用法小结

一、说明

看了奚啸翔同学写的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)在命令后加“;”表示不在commandwindow中显示结果,而对上例来说如果不加“;”

则会显示所赋字符串内容。

(2)所有的命令必须在英文输入状态下,如果使用中文输入状态下全角的“;”,将被处理为非法字符。

其中logical,cell和structure为逻辑,元胞和构架数组类型,将在后面的数组部分提到;functionhandle为函数句柄类型,将在后面的“M脚本文件和M函数文件、函数句柄”部分提到;java类供JAVAAPI应用程序接口使用,本文不进行说明。

最后说明一下,matlab也支持复数操作,赋值的时候直接输入即可,比如:

a=1+2i;

2、基本输入输出

输入:

v=input('message')%将用户输入的内容赋给变量v

v=input('message','s')%将用户输入的内容作为字符串赋给变量v

keyboard%用户可以从键盘输入任意多个指令

v=yesinput('prompt',default,possib)

%prompt为文字提示,default为缺省设置“值”,possib为设置值的范围。

%该指令无法在notebook中运行。

输出:

disp(a)

%显示变量a的内容,另一种显示变量内容的方法是输入变量名,但是这样显示的结果带有“a=”。

三、流程控制

1、运算符

(1)关系操作符

==~=>>=<<=

(2)涉及相互关系的集合运算符

&|~xor

%xor相异元素返回1,相同元素返回0

2、IF

(1)基本:

if逻辑判断式

……

end

(2)多重判断:

if逻辑判断式

......

elseif逻辑判断式

......

else逻辑判断式

......

end

end

end

3、switch-case结构

和C的switch语句一样

switch变量

case数值1

……

case数值2

……

case数值k%当变量等于数值k的时候,执行本组命令,然后跳出该结构。

……

otherwise

……%该命令可以不存在,在变量不等于前面所有的检测值的时候,执行此组命令。

endcase

4、try-catch结构

try%只有当matlab执行本组命令发生错误时,后一组命令才会被执行

……

catch

……%如果此组命令执行又出错,matlab将终止该结构。

end

%可以调用lasterr函数查询出错原因。

如果函数的运行结果为一个空串,则表明这组命令

被成功执行了。

四、循环

1、while

while表达式

……

end

2、for

forx=数值

……

……

end

%其中的数值可以是数组;或者是类似下面的表达“1:

4”,表示从1到4循环;还可以是“

1:

0.1:

4”,表示以0.1为步长从1到4循环。

五、数组、数组运算和矩阵运算

1、数值数组

matlab中数组不需要声明。

(1)对一维数值数组赋初值

逐个元素输入:

x=[12pi/2]

冒号生成:

x=1:

0.1:

4

定数线性采样法:

x=linspace(a,b,n)

%相当于第一个数为a,最后一个数为b,以n为采样点数等间距采样。

x=logspace(a,b,n)

%相当于第一个数为10a,最后一个数为10b,以n为采样点数等间距采样。

(2)对一维数值数组的寻访

x(3)%寻访第三个元素

x([123])%寻访第1,2,3个元素

x(1:

3)%寻访第1到3个元素

x(3:

-1:

1)%由前三个元素倒排成子数组

x(find(x>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+r

2、数组运算和矩阵运算

(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.\s

s分别被B的元素除A.^n

A的每个元素自乘n次A.^p

对A的各个元素分别求非整数幂p.^A

以p为底,分别以A的元素为指数求幂A+B

对应元素相加A-B

对应元素相减A.*B

对应元素相乘A./B

A的元素被B的对应元素除B.\A

同上

exp(A)

以e为底,分别以A的元素为指数求幂

log(A)

对A的各个元素求对数

sqrt(A)

对A的各个元素求平方根

f(A)

求A各个元素的函数值

A#B

对应元素的关系运算,#代表关系运算符

A@B

对应元素的逻辑运算,@代表逻辑运算符

(2)矩阵运算

指令

含义

A'

共轭转置

s*A

标量s分别与A元素之积

S*inv(B)

B阵的逆乘s

A^n

A阵为方阵时,自乘n次

A^p

方阵A的非整数乘方

p^A

A阵为方阵时,标量的矩阵乘方

A+B

矩阵相加

A-B

矩阵相减

A*B

矩阵相乘

A/B

A右除B

B\A

A左除B

expm(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=['aa'

'bb']

或者:

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];

A{1,1}=a;A{1,2}=b;A{2,1}=c;A{2,2}=d;

(2)元胞数组内容的调取

注意在这里()访问的是元胞,用{}访问的是元胞中存储的内容。

比如:

a=A(1,1)

显示:

a=

[12char]

而:

a=A{1,1}

显示:

a=

aa

bb

所以用{}而不是()调取元胞数组内容。

6、构架数组

构架数组和元胞数组类似,但其每个构架(地位相当于元胞数组的元胞)必须划分“域”

后才能使用。

看下面的例子:

green_house(2,3).name='六号房';

green_house(2,3).param.temperature=30;

green_house(2,3).param.humidity=10;

green_house

屏幕显示:

23structarraywithfields:

name

param

注意:

(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、matlabscriptfile:

脚本文件没有输入输出,对工作空间(workspace)中的变量进行操作。

任何可执行的matlab命令都可以写入脚本文件。

先来看一个简单的例子:

例1:

产生一个20元素的一维随机数组并画出。

解:

新建一个m文件命名为randplt.m(或者任何你喜欢的名字),在其中加入如下两行代码

:

data=randn(1,20);

plot(data);

保存后选择debug/run菜单或按F5键运行,观察workspace中多出了一个变量data。

脚本文件执行时,就如同将文件中的每一条命令依次输入到matlab命令行中一样,顺次执

行。

你可以尝试在commandhistory窗口中按住ctrl键选择几行执行过的命令并单击鼠标右

键在快捷菜单中选择creatMfile来快速创建一个m文件。

2、matlabfunction

函数文件可以接受输入和给出输出,当然也可以没有,就像c语言的函数。

matlab函数最大的书写特点(同C比起来)是它的输出变量定义在函数名前面。

看一例:

例2:

matlab内部函数std给出数组的标准差std=sqrt(sum(X)/N),编写函数stderr求实验误差err=sqrt(sum(X)/(N*(N-1))),代码如下:

functionerr=stderr(arr)

%实验误差(标准差估计)

%caculatealongeachcolumnofarr

err=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文件可在第一行前插入一行:

functionrandplt

保存后则该文件成为一个没有输入输出宗量的函数。

一般来说matlab中执行同样的任务使用函数文件比脚本文件的效率高。

3.函数句柄的使用

函数句柄起到c语言中函数指针的作用。

例3:

编写函数求出数组arr1和arr2的标准差(std)以及误差(stderr)。

解:

编写如下文件并保存为erreval.m

function[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')画出的是红色点线。

线型和色彩控制值如下表:

线型

符号

-

-.

--

含义

实线

虚线

点划线

双划线

色彩

符号

b

g

r

c

m

y

k

w

含义

绿

品红

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')%为图像增加标题

gridon%显示坐标网格

legend%显示图例

holdon%在画下一幅图的时候,保留之前的图。

holdoff%停止保留之前的图。

colorbar%显示颜色条

boxon%显示三维图的长方体边框

%全文结束。

 

九、独立的回调函数

建立GUI函数的一个有效方法是编写独立的回调函数,专门执行一个或多个回调。

函数使

用档对象句柄和其它变量可以作为参量传递,必要时回调函数可返回值。

考虑先前的一个例子,建立一个方位角的滑标,以脚本文件来实现。

%setview.mscriptfile

vw=get(gca,'View');

Hc_az=uicontrol(gcf,'Style','slider',...

'Position',[10514020],...

'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',[10254020],...

'String',num2str(get(Hc_az,'Min')));

Hc_max=uicontrol(gcf,'Style','text',...

'Position',[110254020],...

'String',num2str(get(Hc_az,'Max')));

Hc_cur=uicontrol(gcf,'Style','text',...

'Position',[60254020],...

'String',num2str(get(Hc_az,'Value')));

下面是同样的例子。

作为一个函数,采用'Tag'属性来辨别控制框,并使用独立的M

文件件来执行回调

funtionsetview()

vw=get(gca,'View');

Hc_az=uicontrol(gcf,'Style','Slider',...

'Position',[10514020],...

'Min',-90,'Max',90,'Value',vw

(1)),...

'Tag','Azslider',...

'Callback','svcback');

Hc_min=uicontrol(gcf,'style','text,...

'Position',[10254020],...

'String',num2str(get(Hc_az,'Min')));

Hc_max=uicontrol(gcf,'Style','text',...

'Position',[110254020],...

'String',num2str(get(Hc_az,'Max')));

Hc_cur=uicontrol(gcf,'Style','text',...

'Position',[60254020],...

'Tag','Azcur',...

'String',num2str(get(Hc_az,'Value')));

回调函数本身如下:

functionsvcback()

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或ifelseif语句,可将回调函数装入调用函数内。

通常这样一种函数调用的结构functionguifunc(switch)。

其中switch确定执行哪一个函数开关的参量,它可以是字符串'startup','close','sectolor'等等,也可以是代码或数字。

如switch是字符串,则可如下面所示的M文件片段那样将开关编程。

ifnargin<1,switch='startup';end;

if~isstr(switch),error('Invalidargument'),end;

ifstrcmp(switch,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1