基本用法小结.docx
- 文档编号:28577259
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:15
- 大小:27.13KB
基本用法小结.docx
《基本用法小结.docx》由会员分享,可在线阅读,更多相关《基本用法小结.docx(15页珍藏版)》请在冰豆网上搜索。
基本用法小结
(3)字符串与字符串矩阵
MATLAB的字符串是由单引号括起来的。
如可以使用下面的命令赋值
>>strA='Thisisastring.'
多个字符串可以用str2mat()函数构造出字符串矩阵。
如B=str2mat(strA,'ksasaj','aa');字符串变量可以由下表中的命令进行操作:
命令
意义
命令
意义
strcmp(A,B)
比较A和B字符串是否相同。
findstr(A,B)
测试A是否为B的子字符串,或反过来
strrep(A,s1,s2)
在A中用s2替换s1
length(A)
字符串A的长度
deblank(A)
删除A字符串尾部的空格
double(A)
字符串转换双精度数据
(4)单元数据结构
用类似矩阵的记号将给复杂的数据结构纳入一个变量之下。
和矩阵中的圆括号表示下标类似,单元数组由大括号表示下标。
>>B={1,'AlanShearer',180,[100,80,75;77,60,92;67,28,90;100,89,78]}
B=
[1]'AlanShearer'[180][4x3double]
访问单元数组应该由大括号进行,如第4单元中的元素可以由下面的语句得出
>>B{4}
ans=
100 80 75
77 60 92
67 28 90
100 89 78
(5)结构体
MATLAB的结构体有点象C语言的结构体数据结构。
每个成员变量用点号表示,如A.p表示A变量的p成员变量。
获得该成员比C更直观,仍用A.p访问,而不用A->p。
用下面的语句可以建立一个小型的数据库。
>>student_rec.number=1;
student_rec.name='AlanShearer';
student_rec.height=180;
student_rec.test=[100,80,75;77,60,92;67,28,90;100,89,78];
>>student_rec
student_rec=
number:
1
name:
'AlanShearer'
height:
180
test:
[4x3double]
其中test成员为单元型数据。
删除成员变量可以由rmfield()函数进行,添加成员变量可以直接由赋值语句即可。
另外数据读取还可以由setfield和getfield函数完成。
(6)类与对象
类与对象是MATLAB5.*开始引入的数据结构。
在MATLAB手册中定义了一各很好的类--多项式类。
该例子值得细读,去体会类和对象的定义,重载函数编写等信息。
事实上,在实际工具箱设计中,用到了很多的类,例如在控制系统工具箱中定义了LTI(线性时不变系统)类,并在此基础上定义了其子类:
传递函数类TF,状态方程类SS,零极点类ZPK和频率响应类FR。
举例:
我们将通过一个例子来介绍类的构造。
在MATLAB语言使用手册中给出了一个很有代表性的例子:
多项式类的建立问题。
假设我们想为多项式建立一个单独的类,重新定义加、减、乘及乘方等运算,并定义其显示方式。
那么建立一个类至少应该执行下面的步骤:
(这个例子更详细的情况请参考MATLAB手册)
∙首先应该选定一个恰当的名字,例如这里的多项式类可选择为polynom。
∙以这个名字建立一个子目录,目录的名字前加@。
对本例来说,即应该在当前的工作目录下建立@polynom子目录,而这个目录无需在MATLAB路径下再指定。
∙编写一个引导函数,函数名应该和类同名。
定义类的使用方法:
functionp=polynom(a)
ifnargin==0
p.c=[];p=class(p,'polynom');
elseifisa(a,'polynom'),p=a;
else,
p.c=a(:
).';p=class(p,'polynom');
end
可以看出,本函数分三种情况加以考虑:
①如果不给输入变量,则建立一个空的多项式;
②如果输入变量a已经为多项式类,则将它直接传送给输出变量p;
③如果a为向量,则将此向量变换成行向量,再构造成一个多项式对象。
∙如果想正确地显示新定义的类,则必需首先定义display()函数,并对新定义的类重新定义其基本运算。
对多项式来说,我们可以如下定义有关的函数:
∙要改变显示函数的定义,则需在此目录下重新建立一个新函数display()。
这种重新定义函数的方法又称为函数的重载。
显示函数可以如下地重载定义。
functiondisplay(p)
disp('');disp([inputname
(1),'='])
disp('');disp([''char(p)]);disp('');
注意,这里应该定义的是display()而不是disp()。
∙从上面的定义可见,显示函数要求重载定义char()函数,用于把多项式转换成可显示的字符串。
该函数的定义为
functions=char(p)
ifall(p.c==0),s='0';
else
d=length(p.c)-1;s=[];
fora=p.c;
ifa~=0;
if~isempty(s)
ifa>0,s=[s,'+'];
else,s=[s,'-'];a=-a;end
end
ifa~=1|d==0,s=[s,num2str(a)];
ifd>0,s=[s,'*'];end
end
ifd>=2,s=[s,'x^',int2str(d)];
elseifd==1,s=[s'x'];end
end
d=d-1;
end,end
∙仔细研究此函数,可以发现,该函数能自动地按照多项式显示的格式构造字符串。
比如,多项式各项用加减号连接,系数与算子之间用乘号连接,而算子的指数由^表示。
再配以显示函数,则可以将此多项式以字符串的形式显示出来。
∙双精度处理:
双精度转换函数的重载定义是很简单的。
functionc=double(p)
c=p.c;
∙加运算:
两个多项式相加,只需将其对应项系数相加即可。
这样,加法运算的重载定义
可由下面的函数实现。
注意,这里要对plus()函数进行重载定义。
functionp=plus(a,b)
a=polynom(a);b=polynom(b);
k=length(b.c)-length(a.c);
p=polynom([zeros(1,k)a.c]+[zeros(1,-k)b.c]);
同理,还可以重载定义多项式的减法运算:
functionp=minus(a,b)
a=polynom(a);b=polynom(b);
k=length(b.c)-length(a.c);
p=polynom([zeros(1,k)a.c]-[zeros(1,-k)b.c]);
∙乘法运算:
多项式的乘法实际上可以表示为系数向量的卷积,可以由conv()函数直接获得。
故可以如下重载定义多项式的乘法运算。
functionp=mtimes(a,b)
a=polynom(a);b=polynom(b);p=polynom(conv(a.c,b.c));
∙乘方运算:
多项式的乘方运算只限于正整数乘方的运算,其n次方相当于将该多项式自乘n次。
若n=0,则结果为1。
这样我们就可以重载定义多项式的乘方运算为:
functionp=mpower(a,n)
ifn>=0,n=floor(n);a=polynom(a);p=1;
ifn>=1,
fori=1:
n,p=p*a;end
end
else,error('Powershouldbeanon-negativeinteger.')
end
∙多项式求值问题:
可以对多项式求值函数polyval()进行重载定义。
functiony=polyval(a,x)
a=polynom(a);y=polyval(a.c,x);
定义了此类之后,我们就可以方便地进行多项式处理了。
例如我们可以建立两个多项式对象P(s)=x^3+4x^2-7和Q(s)=5x^4+3x^3-1.5x^2+7x+8其相应的~MATLAB语句为
>>P=polynom([1,4,0,-7]),Q=polynom([5,3,-1.5,7,8])
P=
x^3+4*x^2-7
Q=
5*x^4+3*x^3-1.5*x^2+7*x+8
然后调用下面函数就可以得出相应的计算结果
>>P+Q
ans=
5*x^4+4*x^3+2.5*x^2+7*x+1
>>P-Q
ans=
-5*x^4-2*x^3+5.5*x^2-7*x-15
>>P*Q
ans=
5*x^7+23*x^6+10.5*x^5-34*x^4+15*x^3+42.5*x^2-49*x-56
>>X=P^3
X=
x^9+12*x^8+48*x^7+43*x^6-168*x^5-336*x^4+147*x^3+588*x^2-343
>>y=polyval(X,[123456])
y=
-84913175616177********023243986977
由于前面的重载定义,下面的表达式也能得出期望的结果
>>P+[123]
ans=
x^3+5*x^2+2*x-4
∙使用methods()函数可以列出一个新的类已经定义的方法函数名。
>>methods('polynom')
Methodsforclasspolynom:
chardoublempowerpluspolyval
displayminusmtimespolynom
变量的运算
(1)MATLAB变量的代数运算
如果给定两个矩阵A和B,则我们可以用A+B,A-B,A*B可以立即得出其加、减和乘运算的结果。
若这两个矩阵数学上不可以这样运算,则将得出错误信息,并终止正在运行的程序。
在MATLAB下,如果A和B中有一个是标量,则可以无条件地进行这样的运算。
MATLAB不介意这些变量是纯实数还是含有虚部的复数。
矩阵的除法实际上就是线性方程的求解,如Ax=B这一线性方程的解即为x=inv(A)*B,或更简单地x=A\B。
这又称为矩阵的左除,而x=B/A称为矩阵的右除。
方阵的乘方可以由^算符直接得出,如A^n。
用MATLKAB这样的语言,你可以轻易地算出A^0.1,亦即A矩阵开10次方得出的主根。
矩阵的点运算也是相当重要的。
所谓点运算即两个矩阵相应元素的元素,如A.*B得出的是A和B对应元素的积,故一般情况下A*B不等于A.*B。
矩阵的点乘又称为其Hadamard积。
点运算的概念又可以容易地用到点乘方上,例如A.^2,A.^A等都是可以接受的运算式子。
Kronecker乘积是MATLAB在矩阵运算中的另一个有意义的问题,用kron(A,B)立即可以得出两个矩阵的Kronecker乘积。
(2)逻辑运算
MATLAB并没有单独定义逻辑变量。
在MATLAB中,数值只有0和“非0”的区分。
非0往往被认为是逻辑真,或逻辑1。
除了单独两个数值的逻辑运算外,还支持矩阵的逻辑运算,如A&B,A|B,和~A分别表示逻辑与、或、非的运算。
例如,下面的A和B矩阵与运算将得出如下结果
>>A=[0234;1350];B=[1053;1505];A&B
ans=
0 0 1 1
1 1 0 0
(3)关系表达式与表达式函数
MATLAB的大于、小于和等于等关系分别由>、<和==表示。
判定方法不完全等同于C这类只能处理单个标量的语言。
MATLAB关系表达式返回的是整个矩阵。
例如,比较两个矩阵A和B是否相等,则可以给出如下命令,并得出相应的结果
>>A=[0234;1350];B=[1053;1505];A==B
ans=
0 0 0 0
1 0 0 0
确实使得A和B对应元素相等的位将返回1,否则返回0。
MATLAB还可以用>=和<=这样的符号来比较矩阵对应元素的大小。
另外,MATLAB还提供了all()和any()两个函数来对矩阵参数作逻辑判定。
all()函数在其中变元全部非0时返回1,而any()函数在变元有非零元素返回1。
find()函数将返回逻辑关系全部满足时的矩阵下标值,这个函数在编程中是相当常用。
还可以使用isnan()类函数来判定矩阵中是否含有NaN型数据。
如果有则返回这样参数的下标。
此类函数还有isfinite(),isclass(),ishandle()等。
(4)其他运算
MATLAB还支持其他运算,如取整、求余数等。
可以使用rond)_,fix(),rem()等来实现。
在实际编程中,在MATLAB下采用循环语句会降低其执行速度,所以前面的程序可以由下面的命令来代替:
i=1:
100;mysum=sum(i)。
在这一语句中,首先生成了一个向量i,然后用内部函数sum()求出i向量的各个元素之和,或更简单地,该语句还可以写成sum(1:
100)。
如果前面的100改成10000,再运行这一程序,则可以明显地看出,后一种方法编写的程序比前一种方法快得多。
MATLAB并不要求循环点等间距,假设V为任意一个向量,则可以用fori=V来表示循环。
同样的问题在while循环结构下可以表示为
mysum=0;i=1;while(i<=100),mysum=mysum+i;i=i+1;end
条件转移语句:
和C语言相象
if条件式1
条件块语句组1
elseif条件式2
条件块语句组2
...
else
条件块语句组n+1
end
开关结构:
MATLAB从5.0版开始提供了开关语句结构,其基本语句结构为:
switch开关表达式
case表达式1
语句段1
case{表达式2,表达式3,...,表达式m}
语句段2
...
otherwise
语句段n
end
MATLAB开关语句与C有区别:
∙当开关表达式的值等于表达式1时,将执行语句段1,执行完语句段1后将转出开关体,无需像C语言那样在下一个case语句前加break语句,所以本结构在这点上和C语言是不同的。
∙当需要在开关表达式满足若干个表达式之一时执行某一程序段,则应该把这样的一些表达式用大括号括起来,中间用逗号分隔。
事实上,这样的结构是MATLAB语言定义的单元结构,其具体内容将在后面叙述。
∙当前面枚举的各个表达式均不满足时,则将执行otherwise语句后面的语句段,此语句等价于C语言中的default语句。
∙在case语句引导的各个表达式中,不要用重复的表达式,否则列在后面的开关通路将永远也不能执行。
∙程序的执行结果和各个case语句的次序是无关的。
试探结构:
MATLAB从5.2版本开始提供了一种新的试探式语句结构,其一般的形式为:
try
语句段1
catch
语句段2
end
本语句结构首先试探性地执行语句段1,如果在此段语句执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并放弃这段语句,转而执行语句段2中的语句。
这种新的语句结构是C等语言中所没有的。
这里输入和返回变量的实际个数分别由nargin和nargout两个MATLAB保留变量来给出,只要进入该函数,MATLAB就将自动生成这两个变量,不论您是否直接使用这两个变量。
返回变量如果多于1个,则应该用方括号将它们括起来,否则可以省去方括号。
输入变量和返回变量之间用逗号来分割。
注释语句段的每行语句都应该由百分号%引导,百分号后面的内容不执行,只起注释。
用户采用help命令则可以显示出来注释语句段的内容。
此外,正规的变量个数检测也是必要的。
如果输入或返回变量格式不正确,则应该给出相应的提示。
我们将通过下面的例子来演示函数编程的格式与方法。
〖例3-〗假设我们想生成一个nxm阶的Hilbert矩阵,它的第i行第j列的元素值为1/(i+j-1)。
我们想在编写的函数中实现下面几点:
∙如果只给出一个输入参数,则会自动生成一个方阵,即令m=n
∙在函数中给出合适的帮助信息,包括基本功能、调用方式和参数说明
∙检测输入和返回变量的个数,如果有错误则给出错误信息
如果调用时不要求返回变量,则将显示结果矩阵。
其实在编写程序时养成一个好的习惯,无论对程序设计者还是对程序的维护者、使用者都是大有裨益的。
采用MATLAB函数编写格式和上述要求,我们可以编写出一个函数
functionA=myhilb(n,m)
%MYHILBademonstrativeM-function.
%A=MYHILB(N,M)generatesanNbyMHilbertmatrixA.
%A=MYHILB(N)generatesanNbyNsquareHilbertmatrix.
%MYHILB(N,M)displaysONLYtheHilbertmatrix,butdonotreturnany
%matrixbacktothecallingfunction.
%
%Seealso:
HILB.
%DesignedbyProfessorDingyuXUE,NortheasternUniversity,PRC
%5April,1995,LastmodifiedbyDYXat21March,2000
ifnargout>1,error('Toomanyoutputarguments.');end
ifnargin==1,m=n;
elseifnargin==0|nargin>2
error('Wrongnumberofiutputarguments.');
end
A1=zeros(n,m);
fori=1:
n
forj=1:
m
A1(i,j)=1/(i+j-1);
end,end
ifnargout==1,A=A1;elseifnargout==0,disp(A1);end
这样规范编写的函数用help命令可以显示出其帮助信息:
>>helpmyhilb
MYHILBademonstrativeM-function.
A=MYHILB(N,M)generatesanNbyMHilbertmatrixA.
A=MYHILB(N)generatesanNbyNsquareHilbertmatrix.
MYHILB(N,M)displaysONLYtheHilbertmatrix,butdonotreturnany
matrixbacktothecallingfunction.
Seealso:
HILB.
有了函数之后,可以采用下面的各种方法来调用它,并产生出所需的结果。
>>A=myhilb(3,4)
A=
1.00000.50000.33330.2500
0.50000.33330.25000.2000
0.33330.25000.20000.1667
>>A=myhilb(4)
A=
1.00000.50000.33330.2500
0.50000.33330.25000.2000
0.33330.25000.20000.1667
0.25000.20000.16670.1429
>>myhilb(4)
1.00000.50000.33330.2500
0.50000.33330.25000.2000
0.33330.25000.20000.1667
0.25000.20000.16670.1429
MATLAB工具箱编写技巧
放入一个目录中的为某种目的专门编写的一组MATLAB函数就可以组成一个工具箱。
从某种意义上说,任何一个MATLAB语言的使用者都可以是工具箱的作者。
在一个工具箱中,应该有一个名为Contents.m的文件,用来描述工具箱中所有MATLAB函数的名称和意义。
在该文件中第1行应该给出该工具箱的名称,在第2
行中给出该工具箱的版本与修改时间等信息。
然后分类地给出该工具箱中各类函数的最基本功能。
注意,本文件中所有的语句都应该是注释语句,由百分号%引导,空行也应该由%引导。
另外,因为MATLAB是一种解释性语言,所以即使在某个或某些函数中存在语法错误,但如果没执行到该语句时可能就不会发现该错误,这在一个成功的程序设计中是不能容许的。
要查出某目录中所有的M函数语法错误,首先应该用cd命令进入该目录,然后运行pcode*命令进行伪代码转换。
因为该命令会将MATLAB函数转换成伪代码,而在转换过程中该程序将自动翻译每一条语句,所以一旦发现有语法错误,将会停止翻译,给出错误信息。
改正了该语法错误后,再重新执行pcode命令,直到没有错误为止。
至少这样会保证目录下所有的程序不含有语法错误。
Matlab的编程技巧
∙尽量避免使用循环:
循环语句及循环体经常被认为是~MATLAB编程的瓶颈问题。
改进这样的状况有两种方法:
(1)尽量用向量化的运算来代替循环操作。
我们将通过如下的例子来演示如何将一般的循环结构转换成向量化的语句。
〖例3.19〗考虑下面无穷级数求和问题:
如果我们只求出其中前有限项,比如100,000项之和(要精确地求出级数的和,无需求100000项,几十项往往就能得出满意的精度。
这里主要是为了演示循环运算向量化的优越性。
),则可以采用下面的常规语句进行计算
>>ti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 用法 小结