第5章 MATLAB 程序设计
5.1脚本文件和函数文件
M 文件有两种形式:M 脚本文件和M 函数文件。
5.1.1 M 文本编辑器
MATLAB 的M 文件是通过M 文件编辑/调试器窗口(Editor /Debugger)来创建的。 单击MATLAB
桌面上的
图标,或者单击菜单“File ”——“New ”——“M-
file ”,可打开空白的M 文件编辑器,也可以通过打开已有的M 文件来打开M 文件编辑器。如图5.1所示为打开已创建的M 文件。
5.1.2 M 文件的基本格式
下面介绍绘制二阶系统时域曲线的M 文件,欠阻尼系统的时域输出y 与x 的关系为
)cos a x 1sin(e 111y 2x 2
?+?-?--
=?-,【例5.1】为M 脚本文件,【例5.2】为M 函数文
件。
【例5.1】用M 脚本文件绘制二阶系统时域曲线。
%EX0501 二阶系统时域曲线 %画阻尼系数为
0.3的曲线 x=0:0.1:20;
y1=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3)) plot(x,y1,'r')
图5.1 M 文件编辑/调试器窗口
【例5.2】创建一个画二阶系统时域曲线的函数,阻尼系数zeta为函数的输入参数。
function y=Ex0502(zeta)
% EX0502 Step response of quadratic system.
% 二阶系统时域响应曲线
% zeta 阻尼系数
% y 时域响应
%
% copyright 2003-08-01
x=0:0.1:20;
y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta))
plot(x,y)
M函数文件的基本格式:
函数声明行
H1行(用%开头的注释行)
在线帮助文本(用%开头)
编写和修改记录(用%开头)
函数体
例如,在命令窗口输入help和lookfor命令查看帮助信息:
help Ex0502
EX0502 Step response of quadratic system.
二阶系统时域响应曲线
zeta 阻尼系数
y 时域响应
lookfor '二阶系统时域响应'
Ex0502.m: %二阶系统时域响应
5.1.3 M脚本文件
脚本文件的特点:
(1) 脚本文件中的命令格式和前后位置,与在命令窗口中输入的没有任何区别。
(2) MATLAB在运行脚本文件时,只是简单地按顺序从文件中读取一条条命令,送到MATLAB命令窗口中去执行。
(3) 与在命令窗口中直接运行命令一样,脚本文件运行产生的变量都是驻留在MATLAB的工作空间(workspace)中,可以很方便地查看变量,除非用clear命令清除;脚本文件的命令也可以访问工作空间的所有数据,因此要注意避免变量的覆盖而造成程序出错。
【例5.1续】在M文件编辑/调试器窗口中编写M脚本文件绘制二阶系统的多条时域曲线。
(1) 单击MATLAB桌面上的图标打开M文件编辑器。
(2) 将命令全部写入M文件编辑器中,为了能标志该文件的名称,在第一行写入包含文件名的注释。保存文件为Ex0501.m。
%EX0501 二阶系统时域曲线
x=0:0.1:20;
y1=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3))
plot(x,y1,'r')%画阻尼系数为0.3的曲线
hold on
y2=1-1/sqrt(1-0.707^2)*exp(-0.707*x).*sin(sqrt(1-0.707^2)*x+acos(0.707))
plot(x,y2,'g')%画阻尼系数为0.707的曲线
y3=1-exp(-x).*(1+x)
plot(x,y3,'b')%画阻尼系数为1的曲线
(3) 选择M文件编辑器菜单“Debug”——“Run”,就可以在图形窗中看到如图5.2所示的曲线。
图5.2 运行界面
查看工作空间的变量:
whos
Name Size Bytes Class
x 1x201 1608 double array
y1 1x201 1608 double array
y2 1x201 1608 double array
y3 1x201 1608 double array
Grand total is 804 elements using 6432 bytes
5.1.4 M函数文件
函数文件的特点:
(1) 第一行总是以“function”引导的函数声明行;
函数声明行的格式:
function [输出变量列表] = 函数名(输入变量列表)
(2) 函数文件在运行过程中产生的变量都存放在函数本身的工作空间;
(3) 当文件执行完最后一条命令或遇到“return”命令时,就结束函数文件的运行,同时函数工作空间的变量就被清除;
(4) 函数的工作空间随具体的M函数文件调用而产生,随调用结束而删除,是独立的、临时的,在MATLAB运行过程中可以产生任意多个临时的函数空间。
【例5.2续】在M文件编辑/调试器窗口编写计算二阶系统时域响应的M函数文件,并在MATLAB命令窗口中调用该文件。
创建M函数文件并调用的步骤如下:
(1) 编写函数代码
function y=Ex0502(zeta)
%EX0502 画二阶系统时域曲线
x=0:0.1:20;
y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta))
plot(x,y)
(2) 将函数文件保存为“Ex0502.m”。
(3) 在MATLAB命令窗口输入以下命令,则会出现f的计算值和绘制的曲线:
f=Ex0502(0.3)
程序分析:
?第一行指定该文件是函数文件,文件名为“Ex0502”,输入参数为阻尼系数zeta,输出参数为时域响应y。
?当函数文件调用结束,查看x、y:
x
??? Undefined function or variable 'x'.
y
??? Undefined function or variable 'y'.
注意:M脚本文件和M函数文件的文件名及函数名的命名规则与MATLAB变量的命名规则相同。
5.2程序流程控制
5.2.1 for ... end循环结构
语法:
for 循环变量=array
循环体
end
说明:循环体被循环执行,执行的次数就是array的列数,array可以是向量也可以是矩阵,循环变量依次取array的各列,每取一次循环体执行一次。
【例5.3】使用for ... end循环的array向量编程求出 1+3+5...+100 的值。
% EX0503 使用向量for循环
sum=0;
for n=1:2:100
sum=sum+n;
end
sum =
2500
计算的结果为:sum =2500。
程序说明:循环变量为n,n对应为向量1:2:100,循环次数为向量的列数,每次循环n 取一个元素。
【例5.4】使用for ... end循环的array矩阵编程将单位阵转换为列向量。
% EX0504 使用矩阵for循环
sum=zeros(6,1);
for n=eye(6,6)
sum=sum+n;
end
sum
sum =
1
1
1
1
1
1
程序分析:循环变量n对应为矩阵eye(6,6)的每一列,即第一次n为[1;0;0;0;0;0],第一次n为[0;1;0;0;0;0];循环次数为矩阵的列数6。
5.2.2 while ... end循环结构
语法:
while 表达式
循环体
end
说明:只要表达式为逻辑真,就执行循环体;一旦表达式为假,就结束循环。表达式可以是向量也可以是矩阵,如果表达式为矩阵则当所有的元素都为真才执行循环体,如果表达式为nan,MATLAB认为是假,不执行循环体。
【例5.5】与【例5.3】相同,计算1+3+5...+100 的值。
% EX0505 使用while循环
sum=0;
n=1;
while n<=100
sum=sum+n;
n=n+2 ;
sum
n
sum =
2500
n =
101
程序分析:可以看出while ... end循环的循环次数由表达式来决定,当n=101就停止循环。
5.2.3 If…else…end条件转移结构
语法:
if 条件式1
语句段1
elseif 条件式2
语句段2
...
else
语句段n+1
end
说明:当有多个条件时,条件式1为假再判断elseif的条件式2,如果所有的条件式都不满足,则执行else的语句段n+1,当条件式为真则执行相应的语句段;If…else…end结构也可以是没有elseif和else的简单结构。
【例5.6】用If结构执行二阶系统时域响应,根据阻尼系数0 function y=Ex0506(zeta) % EX0506 使用if结构的二阶系统时域响应 x=0:0.1:20; if (zeta>0)&(zeta<1) y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)); elseif zeta==1 y=1-exp(-x).*(1+x); end plot(x,y) 5.2.4 switch…case开关结构 语法: switch 开关表达式 case 表达式1 语句段1 case表达式2 语句段2 ... otherwise 语句段n end 说明: (1) 将开关表达式依次与case后面的表达式进行比较,如果表达式1不满足,则与下一个表达式2比较,如果都不满足则执行otherwise后面的语句段n;一旦开关表达式与某个表达式相等,则执行其后面的语句段。 (2) 开关表达式只能是标量或字符串。 (3) case后面的表达式可以是标量、字符串或元胞数组,如果是元胞数组则将开关表达式与元胞数组的所有元素进行比较,只要某个元素与开关表达式相等,就执行其后的语句段。 【例5.7】用switch…case开关结构得出各月份的季节。 % EX0507 使用switch结构 for month=1:12; switch month case{3,4,5} season='spring' case{6,7,8} season='summer' case{9,10,11} season='autumn' otherwise season='winter' end end season = winter season = winter season = spring season = spring season = spring season = summer season = summer season = summer season = autumn season = autumn season = autumn season = winter 程序分析:开关表达式为向量1:12,case后面的表达式为元胞数组,当元胞数组的某个元素与开关表达式相等,就执行其后的语句段。 5.2.5 try... catch... end试探结构 语法: try 语句段1 catch 语句段2 end 说明:首先试探性地执行语句段1,如果在此段语句执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并放弃这段语句,转而执行语句段2中的语句,当执行语句段2又出现错误,则终止该结构。 【例5.8】用try... catch... end结构来进行矩阵相乘运算。 % EX0508 try结构 n=4; a=magic(n); m=3; b=eye(3); try c=a*b catch c=a(1:m,1:m)*b end lasterr c = 16 2 3 5 11 10 9 7 6 ans = Error using ==> * Inner matrix dimensions must agree. 程序分析:试探出矩阵的大小不匹配时,矩阵无法相乘,则再执行catch后面的语句段,将a的子矩阵取出与b矩阵相乘。可以通过这种结构灵活地实现矩阵的乘法运算。 5.2.6流程控制语句 1. break命令 break命令可以使包含break的最内层的for或while语句强制终止,立即跳出该结构,执行end后面的命令,break命令一般和If结构结合使用。 【例 5.9】将【例 5.5】增加条件用If与break命令结合,停止while循环。计算1+3+5...+100 的值,当和大于1000时终止计算。 % EX0509 用break终止while循环 sum=0; n=1; while n<=100 if sum<1000 sum=sum+n; n=n+2; else break end end sum n sum = 1024 n = 65 程序分析:while…end循环结构嵌套If…else…end分支结构,当sum为1024时跳出while循环结构,终止循环。 2. continue命令 continue命令用于结束本次for或while循环,只结束本次循环而继续进行下次循环。 【例5.10】将If命令与continue命令结合,计算的1~100中所有素数的和,判断是否为素数是将100以内的每个数都被2~n整除,不能被整除的就是素数。 % EX0510 用continue终止while循环 sum=2;ss=0; for n=3:100 for m=2:fix(sqrt(n)) if mod(n,m)==0 ss=1; %能被整除就用ss为1表示 break; %能被整除就跳出内循环 else ss=0; %不能被整除就用ss为0表示 end end if ss==1 continue; %能被整除就跳出本次外循环 end sum=sum+n; end sum sum = 1060 程序分析:fix(sqrt(n))是将n取整;本程序为双重循环,两个for循环嵌套还嵌套一 个if结构;当mod(n,m)==0时就用break跳出判断是否为素数的内循环,并继续用continue 跳出求素数和的外循环而继续下次外循环。 3. return命令 return命令是终止当前命令的执行,并且立即返回到上一级调用函数或等待键盘输入命令,可以用来提前结束程序的运行。 注意:当程序进入死循环,则按Ctrl+break键来终止程序的运行。 4. pause命令 pause命令用来使程序运行暂停,等待用户按任意键继续。 语法: pause %暂停 pause(n) %暂停n秒 5. keyboard命令 keyboard命令用来使程序暂停运行,等待键盘命令,执行完自己的工作后,输入return语句,程序就继续运行。 6. input命令 input命令用来提示用户应该从键盘输入数值、字符串和表达式,并接受该输入。 a=input('input a number:') %输入数值给a input a number:45 a = 45 b=input('input a number:','s') %输入字符串给b input a number:45 b = 45 input('input a number:') %将输入值进行运算 input a number:2+3 ans = 5 5.3函数调用和参数传递 5.3.1子函数和私有函数 1. 子函数 在一个M函数文件中,可以包含一个以上的函数,其中只有一个是主函数,其它则为子函数。 (1) 在一个M文件中,主函数必须出现在最上方,其后是子函数,子函数的次序无任何限制; (2) 子函数不能被其它文件的函数调用,只能被同一文件中的函数(可以是主函数或子函数)调用; (3) 同一文件的主函数和子函数变量的工作空间相互独立; (4) 用help和lookfor命令不能提供子函数的帮助信息。 【例5.11】将【例5.2】画二阶系统时域曲线的函数作为子函数,编写画多条曲线的程序。 function Ex0511() % EX0511 使用函数调用绘制二阶系统时域响应 z1=0.3; Ex0502(z1); %调用Ex0502 hold on z1=0.5 Ex0502(z1)%调用Ex0502 z1=0.707; Ex0502(z1)%调用Ex0502 function y=Ex0502(zeta) %子函数,画二阶系统时域曲线 x=0:0.1:20; y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)) plot(x,y) 程序分析:主函数是Ex0511,子函数是Ex0502,在主函数中三次调用子函数。程序保存为Ex0511.m文件。 2. 私有函数 私有函数是指存放在private子目录中的M函数文件,具有以下性质: (1) 在private目录下的私有函数,只能被其父目录的M函数文件所调用,而不能被其它目录的函数调用,对其它目录的文件私有函数是不可见的,私有函数可以和其它目录下的函数重名; (2) 私有函数父目录的M脚本文件也不可调用私有函数; (3) 在函数调用搜索时,私有函数优先于其它MATLAB路径上的函数。 3. 调用函数的搜索顺序 在MATLAB中调用一个函数,搜索的顺序如下: ?查找是否子函数; ?查找是否私有函数; ?从当前路径中搜索此函数; ?从搜索路径中搜索此函数。 5.3.2局部变量和全局变量 1. 局部变量 局部变量(Local Variables)是在函数体内部使用的变量,其影响范围只能在本函数内,只在函数执行期间存在。 2. 全局变量 全局变量(Global Variables)是可以在不同的函数工作空间和MATALB工作空间中共享使用的变量。 【例5.12】修改【例5.11】在主函数和子函数中使用全局变量。 function Ex0512() % EX0512 使用全局变量绘制二阶系统时域响应 global X X=0:0.1:20; z1=0.3; Ex0502(z1); hold on z1=0.5; Ex0502(z1); z1=0.707; Ex0502(z1); function Ex0502(zeta) %子函数,画二阶系统时域曲线 global X y=1-1/sqrt(1-zeta^2)*exp(-zeta*X).*sin(sqrt(1-zeta^2)*X+acos(zeta)); plot(X,y); 程序分析:X变量为全局变量,在需要使用的主函数和子函数中都需要用global定义;同样如果在工作空间中定义X为全局变量后也可以使用: global X who Your variables are: X 注意:由于全局变量在任何定义过的函数中都可以修改,因此不提倡使用全局变量;必须使用时应十分小心,建议把全局变量的定义放在函数体的开始,全局变量用大写字符命名。 5.3.3函数的参数 1. 参数传递规则 【例 5.13】将【例 5.11】画二阶系统时域的函数修改,使用输入输出参数来实现参数传递,如图5.3所示。 程序分析:主函数Ex0513调用子函数Ex0502,子函数中的zeta为输入参数,函数调用时将z1传递给子函数zeta,子函数计算后将输出参数x和y传回给主函数的x1、y1;主函数调用子函数三次,后面两次参数的传递也是同样。 2. 函数参数的个数 (1) nargin和nargout变量 函数的输入输出参数的个数可以通过变量nargin和nargout获得,nargin用于获得输入参数的个数,nargout用于获得输出参数的个数。 语法: nargin %在函数体内获取实际输入变量的个数 nargout %在函数体内获取实际输出变量的个数 nargin(’fun’) %在函数体外获取定义的输入参数个数 nargout(‘fun’) %在函数体外获取定义的输出参数个数 【例5.14】计算两个数的和,根据输入的参数个数不同使用不同的运算表达式。function [sum,n]=Ex0514(x,y) % EX0514 参数个数可变,计算x和y的和 if nargin==1 sum=x+0; %输入一个参数就计算与0的和 elseif nargin==0 sum=0; %无输入参数就输出0 else sum=x+y; %输入的是两个数则就计算和 end 在命令窗口调用Ex0514函数,分别使用2个、1个和无输入参数结果如下: [y,n]=Ex0514(2,3) y = 5 n = 2 [y,n]=Ex0514(2) y = 2 n = 1 [y,n]=Ex0514 y = n = 注意:如果输入的参数多于输入参数个数,则会出错。 [y,n]=Ex0514(1,2,3) ??? Error using ==> ex0514 Too many input arguments. 也可以在工作空间查看函数体定义的输入参数个数: nargin('Ex0514') ans = 2 【例5.14续】添加以下程序,查看用nargout变量获取输出参数个数。 if nargout==0 %当输出参数个数为0时,运算结果为0 sum=0; end 在命令窗口调用Ex0514函数,当输出参数格式不同时,结果如下: Ex0514(2,3) %当输出参数个数为0时 ans = y=Ex0514(2,3) %当输出参数个数为1时 y = 5 [y,n,x]=Ex0514 %当输出参数个数为太多时 ??? Error using ==> ex0514 Too many output arguments. 程序分析:当输出参数个数为0时,即使有两个输入参数,运算结果也为0,结果送给ans变量;当输出的参数个数太多,也会出错。 (2) varargin和varargout变量 varargin和varargout可以获得输入输出变量的各元素内容。 【例5.15】计算所有输入变量的和。 function [y,n]=Ex0515(varargin) % EX0515 使用可变参数varargin if nargin==0 %当没有输入变量时输出0 disp('No Input variables.') y=0; elseif nargin==1 %当一个输入变量时,输出该数 y=varargin{1}; else n=nargin; y=0; for m=1:n y=varargin{m}+y; %当有多个输入变量时,取输入变量循环相加 end end n=nargin; 在MATLAB的命令窗口中输入不同个数的变量调用函数Ex0515,结果如下: [y,n]=Ex0515(1,2,3,4) %输入4个参数 y = 10 n = 4 [y,n]=Ex0515(1) %输入1个参数 y = 1 n = 1 [y,n]=Ex0515 %无输入参数 No Input variables. y = 0 n = 0 程序分析:n 为输入参数的个数;y 为求和运算的结果。 5.3.4程序举例 【例 5.16】根据阻尼系数绘制不同二阶系统的时域响应,当欠阻尼时 )cos a x 1sin(e 111y 2x 2?+?-?-- =?-,当临界阻尼时x e )x 1(1y -+-=,当过阻尼时 ???? ? ???-+?-?--?-?-=-?+?--?-?-2x )1(2x )1(21e 1e 121 1y 22。 M 文件的程序代码如下: function y=Ex0516(z1) % EX0516 主函数调用子函数,根据阻尼系数绘制二阶系统时域曲线 t=0:0.1:20; if (z1>=0)&(z1<1) y=plotxy1(z1,t); elseif z1==1 y=plotxy2(z1,t); else y=plotxy3(z1,t); end function y1=plotxy1(zeta,x) %画欠阻尼二阶系统时域曲线 y1=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)); plot(x,y1) function y2=plotxy2(zeta,x) %画临界阻尼二阶系统时域曲线 y2=1-exp(-x).*(1+x); plot(x,y2) function y3=plotxy3(zeta,x) %画过阻尼二阶系统时域曲线 y3=1-1/(2*sqrt(zeta^2-1))*(exp(-((zeta-sqrt(zeta^2-1))*x))./(zeta-sqrt(zeta^2-1))... -exp(-((zeta+sqrt(zeta^2-1))*x))./(zeta+sqrt(zeta^2-1))); plot(x,y3) 程序分析:主函数名为Ex0516,三个子函数名分别为plotxy1、plotxy2、plotxy3,文件保存为Ex0516.m 。当在命令窗口中输入以下命令: y=Ex0516(0.3); hold on y=Ex0516(0.707); y=Ex0516(1); y=Ex0516(2); 则产生如图5.4所示时域响应曲线。 【例5.17】编写M 函数文件,通过流程控制语句,建立如下的矩阵。 ??????? ?????? ???-- =00 000 2n 1000 1n 2100n 321 0y function y=Ex0517(m) % EX0517 用循环流程控制语句创建矩阵 y=0; m=m-1; for n=1:m y=[0,y]; %创建全0行 图5.4 不同阻尼系数的时域响应曲线 end for n=1:m a=[1:1:n]; b=a; for k=m:-1:n b=[0,b]; end y=[b;y]; n=n+1; end 程序分析:将矩阵的行列数用输入参数m来确定,输出参数为矩阵y。使用双重循环来创建矩阵,将文件保存为Ex0517.m。 在命令窗口中调用Ex0517函数: y=Ex0517(5) y = 0 1 2 3 4 0 0 1 2 3 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0 5.4 M文件性能的优化和加速 5.4.1 P码文件 1. P码文件的生成 P码文件使用pcode命令生成,生成的P码文件与原M文件名相同,其扩展名为“.p”。 语法: pcode Filename.m %在当前目录生成Filename.p pcode Filename.m -inplace %在Filename.m所在目录生成Filename.p pcode Ex0517.m 则在当前目录就生成了P码文件Ex0517.p。 2. P码文件的特点 (1) P码文件的运行速度比原M文件速度快 (2) 存在同名的M文件和P码文件时则P码文件被调用 (3) P码文件保密性好 用字处理软件打开Ex0517.p文件,看到的是乱码。 5.4.2 M 文件性能优化 1. 使用循环时提高速度的措施 循环语句及循环体是MATLAB 编程的瓶颈问题,改进这种状况有三种方法: (1) 尽量用向量的运算来代替循环操作。 (2) 在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的,也可以显著提高速度。 (3) 应用Mex 技术 如果耗时的循环不可避免,就应该考虑用其他语言,如C 或Fortran 语言,按照Mex 技术要求的格式编写相应部分的程序,然后通过编译联接,形成在MATLAB 可以直接调用的动态链接库(DLL)文件,这样就可以显著地加快运算速度(在8.1.1小节介绍)。 2. 大型矩阵的预先定维 给大型矩阵动态地定维是个很费时间的事。 【例 5.18】将【例 5.17】中的双重循环改为单循环,并先用zeros 函数定维来提高运行速度,创建矩阵??????? ?????? ???--=00 000 2n 1000 1n 2100n 321 0y 。 function y=Ex0518(m) % EX0518 先定维再创建矩阵 m=m-1; y=zeros(m); for n=1:m-1 a=1:m-n; y(n,n+1:m)=a; end y 在命令窗口中分别调用Ex0517和Ex0518函数,比较其运行速度的不同: y=Ex0517(200) y=Ex0518(200) 3. 优先考虑内在函数 矩阵运算应该尽量采用MATLAB 的内在函数,因为内在函数是由更底层的C 语言构造的,其执行速度显然很快。 4. 采用高效的算法 在实际应用中,解决同样的数学问题经常有各种各样的算法。因此,应寻求更高效的算法。 5. 尽量使用M 函数文件代替M 脚本文件 由于M 脚本文件每次运行时,都必须把程序装入内存,然后逐句解释执行,十分费时。 5.4.3 JIT和加速器 1. JIT和加速器的加速范围 JIT和加速器的应用范围如下: ?只对维数不超过3的“非稀疏”数组起作用; ?只对“双精度”、“整数”、“字符串”和“逻辑”等四种数据类型起作用; ?只对内部函数的调用起作用,对用户的M函数或MEX文件不起作用; ?只对控制语句for、while、if、elseif、switch中标量运算的条件表达式起作用; ?当一行程序中含有“不可加速的”命令或变量时,整行都不被加速; ?当变量改变数据类型或维数,则该语句不被加速; ?如果i和j不以虚数单位形式使用,则该语句不被加速; ?在Intel系列CPU硬件上,Windows和Linux系统加速能力最强。 2. 使用程序性能剖析窗口 (1) 打开程序性能剖析窗口 选择菜单“View”——“Profiler”;或使用在命令窗口输入“profile viewer”命令都可以打开程序性能剖析窗口,如图5.5所示。 图5.5 程序性能剖析窗口 (2) 对MATLAB的命令进行剖析 对MATLAB的命令进行剖析有两种方式: ?在上图中的“命令输入栏”中输入需要剖析的命令,然后单击“Start Profiling”按钮,则指示灯变为绿色,“Start Profiling”按钮变灰色,时间指示器的计时在累加;当命令运行结束时,状态恢复,并出现剖析报告。 ?将“命令输入栏”清空,然后单击“Start Profiling”按钮开始剖析,则“Start Profiling”按钮变为“Stop Profiling”,指示灯变为绿色表示启动剖析,时间指示器的计时在累加;然后在MATLAB命令窗口中输入需要剖析的命令,进行剖析;当命令运行结束,单击“Stop Profiling”按钮停止剖析,则状态恢复,并出现剖析报告。这种方式的时间指示器显示的只是单击按钮“Stop Profiling”开始到单击“Stop Profiling”按钮的时间,并不表示命令的运行时间。 (3) 查看剖析报告