资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
(3) 字符串与字符串矩阵 MATLAB 的字符串是由单引号括起来的。如可以使用下面的命令赋值 strA=This is a string. 多个字符串可以用 str2mat() 函数构造出字符串矩阵。如 B=str2mat(strA, ksa saj,aa);字符串变量可以由下表中的命令进行操作: 命令意义命令意义strcmp(A,B)比较A和B字符串是否相同。findstr(A,B)测试A是否为B的子字符串,或反过来strrep(A,s1,s2)在A中用s2替换s1length(A)字符串A的长度deblank(A)删除A字符串尾部的空格double(A)字符串转换双精度数据(4) 单元数据结构 用类似矩阵的记号将给复杂的数据结构纳入一个变量之下。和矩阵中的圆括号表示下标类似,单元数组由大括号表示下标。 B=1,Alan Shearer,180,100, 80, 75; 77, 60, 92; 67, 28, 90; 100, 89, 78B = 1 Alan Shearer 180 4x3 double访问单元数组应该由大括号进行,如第 4 单元中的元素可以由下面的语句得出 B4ans = 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=Alan Shearer;student_rec.height=180;student_rec.test=100, 80, 75; 77, 60, 92; 67, 28, 90; 100, 89, 78; student_recstudent_rec = number: 1 name: Alan Shearer height: 180 test: 4x3 double其中 test 成员为单元型数据。删除成员变量可以由 rmfield() 函数进行,添加成员变量可以直接由赋值语句即可。另外数据读取还可以由 setfield 和 getfield 函数完成。 (6) 类与对象 类与对象是 MATLAB 5.* 开始引入的数据结构。在 MATLAB 手册中定义了一各很好的类 - 多项式类。该例子值得细读,去体会类和对象的定义,重载函数编写等信息。事实上,在实际工具箱设计中,用到了很多的类,例如在控制系统工具箱中定义了 LTI (线性时不变系统) 类,并在此基础上定义了其子类:传递函数类 TF, 状态方程类 SS, 零极点类 ZPK 和频率响应类 FR。 举例:我们将通过一个例子来介绍类的构造。 在 MATLAB 语言使用手册中给出了一个很有代表性的例子:多项式类的建立问题。假设我们想为多项式建立一个单独的类,重新定义加、减、乘及乘方等运算,并定义其显示方式。那么建立一个类至少应该执行下面的步骤:(这个例子更详细的情况请参考 MATLAB 手册) 首先应该选定一个恰当的名字,例如这里的多项式类可选择为 polynom。 以这个名字建立一个子目录,目录的名字前加 。对本例来说,即应该在当前的工作目录下建立 polynom 子目录,而这个目录无需在 MATLAB 路径下再指定。 编写一个引导函数,函数名应该和类同名。定义类的使用方法:function p = polynom(a)if nargin = 0p.c = ; p = class(p,polynom);elseif isa(a,polynom), p = a;else,p.c = a(:).; p = class(p,polynom);end可以看出,本函数分三种情况加以考虑: 如果不给输入变量,则建立一个空的多项式; 如果输入变量 a 已经为多项式类,则将它直接传送给输出变量 p; 如果 a 为向量,则将此向量变换成行向量,再构造成一个多项式对象。 如果想正确地显示新定义的类,则必需首先定义 display() 函数,并对新定义的类重新定义其基本运算。对多项式来说,我们可以如下定义有关的函数: 要改变显示函数的定义,则需在此目录下重新建立一个新函数 display()。这种重新定义函数的方法又称为函数的重载。显示函数可以如下地重载定义。function display(p)disp( ); disp(inputname(1), = )disp( ); disp( char(p); disp( );注意,这里应该定义的是 display() 而不是 disp()。 从上面的定义可见,显示函数要求重载定义 char() 函数,用于把多项式转换成可显示的字符串。 该函数的定义为function s=char(p)if all(p.c=0), s =0;elsed=length(p.c)-1; s=;for a=p.c;if a=0;ifisempty(s)if a0, s=s, + ;else, s=s, - ; a = -a; endendif a=1 | d=0, s=s, num2str(a);if d0, s=s, *; endendif d=2, s=s, x, int2str(d);elseif d=1, s=s x; endendd=d-1;end, end 仔细研究此函数,可以发现,该函数能自动地按照多项式显示的格式构造字符串。比如,多项式各项用加减号连接,系数与算子之间用乘号连接,而算子的指数由 表示。再配以显示函数,则可以将此多项式以字符串的形式显示出来。 双精度处理:双精度转换函数的重载定义是很简单的。function c = double(p)c = p.c; 加运算:两个多项式相加,只需将其对应项系数相加即可。这样,加法运算的重载定义可由下面的函数实现。注意,这里要对 plus() 函数进行重载定义。function p=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);同理,还可以重载定义多项式的减法运算:function p=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() 函数直接获得。 故可以如下重载定义多项式的乘法运算。function p=mtimes(a,b)a=polynom(a); b=polynom(b); p=polynom(conv(a.c,b.c); 乘方运算: 多项式的乘方运算只限于正整数乘方的运算,其 n 次方相当于将该多项式自乘 n 次。若 n=0,则结果为 1。 这样我们就可以重载定义多项式的乘方运算为:function p=mpower(a,n)if n=0, n=floor(n); a=polynom(a); p=1;if n=1,for i=1:n, p=p*a; endendelse, error(Power should be a non-negative integer.)end 多项式求值问题:可以对多项式求值函数 polyval() 进行重载定义。function y=polyval(a,x)a=polynom(a); y=polyval(a.c,x);定义了此类之后,我们就可以方便地进行多项式处理了。例如我们可以建立两个多项式对象 P(s)=x3+4x2-7 和 Q(s)=5x4+3x3-1.5x2+7x+8 其相应的MATLAB 语句为 P=polynom(1,4,0,-7), Q=polynom(5,3,-1.5,7,8)P =x3 + 4*x2 - 7Q =5*x4 + 3*x3 - 1.5*x2 + 7*x + 8然后调用下面函数就可以得出相应的计算结果 P+Qans =5*x4 + 4*x3 + 2.5*x2 + 7*x + 1 P-Qans =-5*x4 - 2*x3 + 5.5*x2 - 7*x - 15 P*Qans =5*x7 + 23*x6 + 10.5*x5 - 34*x4 + 15*x3 + 42.5*x2 - 49*x - 56 X=P3X =x9 + 12*x8 + 48*x7 + 43*x6 - 168*x5-336*x4+147*x3+588*x2-343 y=polyval(X,1 2 3 4 5 6)y =-8 4913 175616 1771561 10360232 43986977由于前面的重载定义,下面的表达式也能得出期望的结果 P+1 2 3ans =x3 + 5*x2 + 2*x - 4 使用 methods() 函数可以列出一个新的类已经定义的方法函数名。 methods(polynom)Methods for class polynom:char double mpower plus polyvaldisplay minus mtimes polynom变量的运算(1) MATLAB 变量的代数运算 如果给定两个矩阵 A 和 B, 则我们可以用 A+B, A-B, A*B 可以立即得出其加、减和乘运算的结果。若这两个矩阵数学上不可以这样运算,则将得出错误信息,并终止正在运行的程序。 在 MATLAB 下,如果 A 和 B 中有一个是标量,则可以无条件地进行这样的运算。MATLAB 不介意这些变量是纯实数还是含有虚部的复数。 矩阵的除法实际上就是线性方程的求解,如 Ax=B 这一线性方程的解即为 x=inv(A)*B, 或更简单地 x=AB。这又称为矩阵的左除,而 x=B/A 称为矩阵的右除。 方阵的乘方可以由 算符直接得出,如 An。用 MATLKAB 这样的语言,你可以轻易地算出 A0.1, 亦即 A 矩阵开 10 次方得出的主根。 矩阵的点运算也是相当重要的。所谓点运算即两个矩阵相应元素的元素,如 A.*B 得出的是 A 和 B 对应元素的积,故一般情况下 A*B 不等于 A.*B。矩阵的点乘又称为其 Hadamard 积。点运算的概念又可以容易地用到点乘方上,例如 A.2, A.A 等都是可以接受的运算式子。 Kr
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号