matlab基本用法小结Word格式文档下载.docx
《matlab基本用法小结Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《matlab基本用法小结Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
当需要创建一个字符型变量x并对其赋初值时,用以下格式:
x='
字符串'
;
注意:
(1)在命令后加“;
”表示不在commandwindow中显示结果,而对上例来说如果不加“;
”
则会显示所赋字符串内容。
(2)所有的命令必须在英文输入状态下,如果使用中文输入状态下全角的“;
”,将被处理为非法字符。
其中logical,cell和structure为逻辑,元胞和构架数组类型,将在后面的数组部分提到;
functionhandle为函数句柄类型,将在后面的“M脚本文件和M函数文件、函数句柄”部分提到;
java类供JAVAAPI应用程序接口使用,本文不进行说明。
最后说明一下,matlab也支持复数操作,赋值的时候直接输入即可,比如:
a=1+2i;
2、基本输入输出
输入:
v=input('
message'
)%将用户输入的内容赋给变量v
'
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)多重判断:
......
elseif逻辑判断式
else逻辑判断式
end
3、switch-case结构
和C的switch语句一样
switch变量
case数值1
……
case数值2
case数值k%当变量等于数值k的时候,执行本组命令,然后跳出该结构。
otherwise
……%该命令可以不存在,在变量不等于前面所有的检测值的时候,执行此组命令。
endcase
4、try-catch结构
try%只有当matlab执行本组命令发生错误时,后一组命令才会被执行
catch
……%如果此组命令执行又出错,matlab将终止该结构。
%可以调用lasterr函数查询出错原因。
如果函数的运行结果为一个空串,则表明这组命令
被成功执行了。
四、循环
1、while
while表达式
2、for
forx=数值
%其中的数值可以是数组;
或者是类似下面的表达“1:
4”,表示从1到4循环;
还可以是“
1:
0.1:
4”,表示以0.1为步长从1到4循环。
五、数组、数组运算和矩阵运算
1、数值数组
matlab中数组不需要声明。
(1)对一维数值数组赋初值
逐个元素输入:
x=[12pi/2]
冒号生成:
x=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('
还可以:
S=str2mat('
'
)%这里空串会产生空行
而:
S=str2cat('
)%这里空串不会产生空行
(2)字符串操作函数
int2str%把整数数组转换为串数组
num2str%把非整数数组转换为串数组
mat2str%把数值数组转换为串数组
%请使用help搜索其他的字符串操作函数。
5、元胞数组
元胞数组和一般数值数组和字符串数组不同,其元素可以是任意类型和大小的对象。
这
和C的结构型数组有些类似。
(1)创建元胞数组
有以下两种创建方式:
外标识元素赋值:
a=char('
);
b=1:
9;
c=2:
d=[1+2i];
A(1,1)={a};
A(1,2)={b};
A(2,1)={c};
A(2,2)={d};
内涵的直接赋值:
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}
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)空数组可用于子数组的删除和数组大小的收缩
2)=[]
六、M脚本文件和M函数文件、函数句柄
m文件分两种:
函数和脚本。
脚本文件没有输入输出,对工作空间(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;
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,'
)))),'
...
set(gca,'
,[get(Hc_az,'
)vw
(2)])'
])
Hc_min=uicontrol(gcf,'
style'
text'
,[10254020],...
)));
Hc_max=uicontrol(gcf,'
,[110254020],...
Hc_cur=uicontrol(gcf,'
,[60254020],...
下面是同样的例子。
作为一个函数,采用'
Tag'
属性来辨别控制框,并使用独立的M
文件件来执行回调
funtionsetview()
Slider'
,vw
(1)),...
Azslider'
svcback'
text,...
Azcur'
回调函数本身如下:
functionsvcback()
vw=get(gca,'
Hc_az=findobj(gcf,'
AZslider'
Hc_cur=findobj(gcf,'
AZcur'
str=num2str(get(Hc_az,'
));
newview=[get(Hc_az,'
)vw
(2)];
set(Hc_cur,'
,str)
set(gca,'
,newview)
上面的例子并不节省很多代码,但却得到了用函数而不用脚本文件的优点:
回调函数可以利利用临时变量,而不使命令窗口工作空间拥挤;
不需要eval所需的引号和字符串;
在回调函数中命令的句法变得十分简单。
使用独立回调函数技术,越复杂的回调(函数)越简单。
独立回调函数的缺点是:
需要很大数目的M文件以实现一个含有若干控制框和菜单项的GUI函函数,所有这些M文件必须在MATLAB路径中可得,且每一个文件又必须要有一个不同的文件名。
在对文件名大小有限制且对大小写不敏感的平台上,如MS-w