第三章 matlab 提高 计算机仿真与模拟第三章 Matlab提高
3.1 matlab编程基础
3.2 图形基础第三章 matlab 提高 计算机仿真与模拟
3.1 MATLAB编程基础
1 概述
2 流程控制
3 脚本文件
4 函数文件
5 M文件调试
6 M文件性能分析第三章 matlab 提高 计算机仿真与模拟
1 概 述
MATLAB提供了完整的编写应用程序的能力,这种能力通过一种被称为 M语言的高级语言来实现。这种编程语言是一种解释性语言,利用该语言编写的代码仅能被 MATLAB接受,被
MATLAB解释、执行。其实,一个 M语言文件就是由若干
MATLAB的命令组合在一起构成的,这些命令都是在前面章节中介绍的合法的 MATLAB命令。和 C语言类似,M语言文件都是标准的纯文本格式的文件,其文件的扩展名为,m。
第三章 matlab 提高 计算机仿真与模拟使用 M文件最直接的好处就是可以将一组 MATLAB命令组合起来,通过一个简单的指令就可以执行这些命令 。 这些命令可以完成某些 MATLAB的操作,也可以实现某个具体的算法 。
其实,MATLAB产品族中包含的工具箱就是由世界上在相应专业领域内的顶尖高手,利用 M语言开发的算法函数文件集合 。
MATLAB的函数主要有两类,一类被称为内建 (Build-in)函数,这类函数是由 MATLAB的内核提供的,能够完成基本的运算,例如三角函数,矩阵运算的函数等 。 另外一类函数就是利用高级语言开发的函数文件,这里的函数文件既包括用 C语言开发的 MEX函数文件,又包含了 M函数文件 。
第三章 matlab 提高 计算机仿真与模拟如前所述,MATLAB的 M语言文件是纯文本格式的文件,
利用任何一种纯文本编辑器都可以编写相应的文件,例如
Windows平台下的记事本,UltraEdit等软件,或者 Unix平台下的 Emacs软件等 。 同样,为了方便编辑 M文件,MATLAB也提供了一个编辑器,叫作 meditor,它也是系统默认的 M文件编辑器 。
运行 meditor的方法非常简单,在 MATLAB命令行窗口中键入下面的指令就可以打开 meditor:
>> edit
这时 MATLAB将启动 meditor,然后创建一个未命名的空白文件,如图 1所示。
第三章 matlab 提高 计算机仿真与模拟图 1 meditor的运行界面第三章 matlab 提高 计算机仿真与模拟这时用户就可以直接在编辑器中键入 MATLAB指令,开发 M语言文件了 。
此外,运行 meditor还可以通过,File”菜单中,New”子菜单下的,M-File”命令来实现,或者直接单击 MATLAB用户界面工具栏上的新建按钮完成同样的工作 。
M语言文件可以分为两类,其中一类是脚本文件,另外一类叫作函数文件。下面将分别介绍这两类文件的编写方法。
第三章 matlab 提高 计算机仿真与模拟
2 流 程 控 制
2.1 选择结构如前所述,当人们判断某一条件是否满足,根据判断的结果来选择不同的解决问题的方法时,就需要使用选择结构。和
C语言类似,MATLAB的条件判断可以使用 if语句或者 switch 语句。
第三章 matlab 提高 计算机仿真与模拟
2.1.1 if语句
if语句的基本语法结构有三种,分别如下:
(1) if 关系运算表达式
MATLAB语句
end
这种形式的选择结构表示,当关系运算表达式计算的结果为逻辑真的时候,执行 MATLAB语句,这里的 MATLAB语句可以是一个 MATLAB表达式,也可以是多个 MATLAB表达式。在
MATLAB语句的结尾处,必须有关键字 end。
第三章 matlab 提高 计算机仿真与模拟
(2) if 关系运算表达式
MATLAB语句 A
else
MATLAB语句 B
end
这种选择结构表示,当关系运算表达式的计算结果为逻辑真的时候,执行 MATLAB语句 A,否则执行 MATLAB语句 B,
在语句 B的结尾必须具有关键字 end。
第三章 matlab 提高 计算机仿真与模拟
(3) if 关系运算表达式 a
MATLAB语句 A
elseif 关系运算表达式 b
MATLAB语句 B
else 关系运算表达式 c
end
这种选择结构可以判断多条关系运算表达式的计算结果,
然后按照执行的逻辑关系执行相应的语句。
…
第三章 matlab 提高 计算机仿真与模拟例子 1 if语句的使用 ——if_examp.m。
通过本例子将同时了解 meditor的基本使用方法 。 打开 meditor,
然后键入下面的指令:
001 clear all
002
003 I=1;
004 J=2;
005
006 if I == J
007 A(I,J) = 2;
008 elseif abs(I-J) == 1
009 A(I,J) = -1;
010 else
011 A(I,J) = 0;
012 end
第三章 matlab 提高 计算机仿真与模拟注意:
在键入程序时,不要将行号 (001~ 012)也敲进去,在这里设置行号的主要目的是为了便于讲解和分析程序 。
所有的指令键入完毕后,将文件保存,可以将其保存为任何名字,不过文件名必须由英文字符和数字组成,将文件的扩展名设置为,m,并且将文件保存在 MATLAB的搜索路径下,例如 MATLAB当前的工作路径 。
然后在 MATLAB的命令行中,键入刚才保存的文件名,不过,这时不要将扩展名也一同键入,MATLAB就会依次执行这些指令。
第三章 matlab 提高 计算机仿真与模拟运行例子 1的方法和效果如下:
>> if_examp
A =
0 -1
例子 1代码的核心是 006~ 012行的部分,这部分展示了 if-
elseif-else-end语句组合的使用方法 。 请仔细察看,并且通过修改程序 003和 004行中对 I和 J的赋值来察看整个语句的执行情况 。
和 C语言类似,if-elseif-else的语句结构也可以嵌套地使用,
也就是可以存在这样的语句结构:
第三章 matlab 提高 计算机仿真与模拟
if(关系表达式 a)
if(关系表达式 b) MATLAB语句 A
else MATLAB语句 B
end
else
if(关系表达式 c) MATLAB语句 C
else MATLAB语句 D
end
end
第三章 matlab 提高 计算机仿真与模拟注意:
在使用嵌套的选择结构时,需要小心 if语句和 end关键字的配对。
例子 2 嵌套使用的 if结构 ——if_examp2.m。
001 clear all
002
003 if 1
004 disp('Is 1')
005 else
006 disp('Not 1')
007 end
008
第三章 matlab 提高 计算机仿真与模拟
009 I = 1;
010 if I
011 if I < 2
012 disp('I is bigger than 0 but less than 2')
013 end
014 else
015 if I > -2
016 dis('I is less than 0 but bigger than -2')
017 end
018 end
第三章 matlab 提高 计算机仿真与模拟该程序的运行方法和效果如下:
>> if_examp2
Is 1
I is bigger than 0 but less than 2
在例子 2中,主要说明了嵌套的 if结构和在关系表达式中使用常量的方法。在代码的 003行,if语句的关系表达式为常数 1,
这个时候 if语句将始终认为非零值为逻辑真,所以,程序执行了 004行的代码。同样,在程序的 009行,if语句的关系表达式为变量 I,若 I的数值为非零值,则 if语句判断其为逻辑真,所以,
代码的 016行只有在 I为 0时,才可能被执行。
第三章 matlab 提高 计算机仿真与模拟
2.1.2 switch语句另外一种构成选择结构的关键字就是 switch。 在处理实际问题的时候,往往要处理多个分支,这时如果使用 if-else语句处理多分支结构往往使程序变得十分冗长,从而降低了程序的可读性 。 switch语句就可以用于处理这种多分支的选择,它的基本语法结构如下:
第三章 matlab 提高 计算机仿真与模拟
switch(表达式 )
case 常量表达式 a,MATLAB语句 A
case 常量表达式 b,MATLAB语句 B
case 常量表达式 m,MATLAB语句 M
otherwise,MATLAB语句 N
end
…
第三章 matlab 提高 计算机仿真与模拟在 switch语句之后的表达式可以是一个数值类型表达式或者是一个数值类型的变量,当这个表达式的值同 case后面的某一个常量表达式相等时,则执行该 case后面的常量表达式后面的语句 。
注意:
MATLAB的 switch和 C语言的 switch语句结构不同。在 C语言中,每一个 case后面的语句中必须包含类似 break语句的流程控制语句,否则程序会依次执行符合条件的 case语句后面的每一个 case分支。但是在 MATLAB中就不必如此,程序仅仅执行符合条件的 case分支。
第三章 matlab 提高 计算机仿真与模拟例子 3 switch结构使用示例 ——switch_examp.m。
001 clear all
002
003 algorithm =
input(‘Enter an algorithm in quotes (ode23,ode15s,etc:) ’,’s’);
004
005 switch algorithm
006 case 'ode23'
007 str = '2nd/3rd order';
008 case {'ode15s','ode23s'}
009 str = 'stiff system';
010 otherwise
011 str = 'other algorithm';
012 end
013 disp(str);
第三章 matlab 提高 计算机仿真与模拟该文件的运行方法和效果如下:
>> switch_examp
Enter an algorithm in quotes (ode23,ode15s,etc:) 'ode23'
2nd/3rd order
>> switch_examp
Enter an algorithm in quotes (ode23,ode15s,etc:) 'ode4'
other algorithm
第三章 matlab 提高 计算机仿真与模拟例子 3中需要用户在执行程序的过程中输入一个字符串,
switch语句根据用户的输入判断执行相应的 case分支 。 若没有符合条件的 case分支,则 switch执行 otherwise后面的语句 。 若
switch结构中没有定义 otherwise及其相应的代码,则程序不会进行任何操作,而是直接退出 switch结构 。
提示:
在处理以字符串变量或者常量参与的关系判断操作时,使用 switch结构要比 if-else结构效率高一些 。
由于 MATLAB的 switch结构没有 C语言的 fall-through特性,
所以,如果需要针对多个条件而使用同一个 case分支的时候,
需要使用元胞数组与之配合,参见例子 4。
第三章 matlab 提高 计算机仿真与模拟例子 4 switch结构使用示例 ——switch_examp2.m。
001 clear all
002
003 var = input('Input a Numer:');
004 switch var
005 case 1
006 disp('1')
007 case {2,3,4}
008 disp('2 or 3 or 4')
009 case 5
010 disp('5')
011 otherwise
012 disp('something else')
013 end
第三章 matlab 提高 计算机仿真与模拟例子 4运行的方法和效果如下:
>> switch_examp2
Input a Numer:1
1
>> switch_examp2
Input a Numer:3
2 or 3 or 4
>> switch_examp2
Input a Numer:7
something else
第三章 matlab 提高 计算机仿真与模拟例子 4代码的核心部分为 007行,这里使用元胞数组增加判断条件的个数,当输入的数字为 2,3或者 4时,switch结构将使用同一个 case分支进行判断,计算 。
注意:
从代码的完整性和可靠性角度出发,在使用 switch语句时,
一定要包含 otherwise分支,这是一种良好的编程习惯。
第三章 matlab 提高 计算机仿真与模拟
2.2 循环结构在解决很多问题的时候需要使用循环结构,例如求解数列的和或者进行某种迭代法求解数值方程时,都需要循环结构配合完成计算 。
在 MATLAB中,包含两种循环结构,一种是循环次数不确定的 while循环,而另一种是循环次数确定的 for循环。
第三章 matlab 提高 计算机仿真与模拟
1,while循环结构
while语句可以用来实现,当,型的循环结构,它的一般形式如下:
while(表达式 )
MATLAB语句
end
当表达式为真时,循环将执行由语句构成的循环体,其特点是先判断循环条件,如果循环条件成立,即表达式运算结果为“真”,再执行循环体。循环体执行的语句可以是一句也可以是多句,在 MATLAB语句之后必须使用关键字 end作为整个循环结构的结束。另外,在循环过程中一定要能够改变关系表达式或者布尔类型变量的值,或者使用其他方法来跳出循环,否则会陷入死循环 (无法正常退出的循环叫作死循环 )。
第三章 matlab 提高 计算机仿真与模拟例子 5 使用 while语句求解 。
001 i = 1;
002 sum = 0;
003 while ( i <= 1000 )
004 sum = sum+i;
005 i = i+1;
006 end
007 str = ['计算结果为,',num2str(sum)];
008 disp(str)
1000
1n
n
第三章 matlab 提高 计算机仿真与模拟例子 5的运行结果为
>> while_example
计算结果为,500500
例子 5的 002~006行使用了 while循环结构,在循环结构中进行了累加的操作。需要注意的是,在 MATLAB中没有类似 C
语言的 ++或者 +=等运算操作符,因此在进行诸如累加或者递减的运算时,不得不给出完整的表达式。另外,例子 5求数列和的算法的运算效率很低,在 MATLAB中不要使用这样的结构完成类似的运算,而需要采用向量化的计算。
第三章 matlab 提高 计算机仿真与模拟注意:
while循环结构的关系表达式可以是某个数据变量或者常量,这时,将按照非零值为逻辑真进行相应的操作。另外,
在进行上述操作时,若数据变量为空矩阵,则 while语句将空矩阵作为逻辑假处理,也就是说,在 while A MATLAB语句 S1
end结构中,若 A为空矩阵,则 MATLAB语句 S1永远不会被执行。
第三章 matlab 提高 计算机仿真与模拟
2,for循环结构使用 for语句构成循环是最灵活,简便的方法,不过,使用 for语句循环需要预先知道循环体执行的次数,所以这种循环一般叫作确定循环 。 在 MATLAB中 for循环的基本结构如下:
for index = start:increment:end
MATLAB语句
end
其中,index的取值取决于 start和 end的值,一般地,这里通常使用等差的数列向量,参见例子 6。
第三章 matlab 提高 计算机仿真与模拟例子 6 使用 for语句求解 。
001 sum = 0;
002 for i = 1:1000
003 sum = sum+i;
004 end
005 str = ['计算结果为,',num2str(sum)];
006 disp(str)
1000
1n
n
第三章 matlab 提高 计算机仿真与模拟例子 6运行的结果为
>> for_example
计算结果为,500500
在例子 6中,002行的代码使用了确定次数的 for循环结构,
循环次数使用行向量进行控制,而且索引值 i按照默认的数值 1
进行递增 。
在 for循环语句中,不仅可以使用行向量进行循环迭代的处理,也可以使用矩阵作为循环次数的控制变量,这时循环的索引值将直接使用矩阵的每一列,循环的次数为矩阵的列数,参见例子 7。
第三章 matlab 提高 计算机仿真与模拟例子 7 for循环示例。
001 A = rand(3,4);
002
003 for i = A
004 sum = mean(i)
005 end
例子 7运行的结果为
>> for_matrices
sum =
0.2728
sum =
0.6649
sum =
0.4275
sum =
0.5220
第三章 matlab 提高 计算机仿真与模拟例子 7尽管只有短短的几行,但是在 003行使用了一个矩阵作为循环的索引值,于是,循环结果就分别计算矩阵的每一列元素的均值 。
和其他高级语言类似,MATLAB的循环结构也可以进行嵌套使用,使用嵌套的循环需要注意 for关键字和 end关键字之间的配对使用。
第三章 matlab 提高 计算机仿真与模拟
2.3 break语句和 continue语句在循环结构中还有两条语句会影响程序的流程,这就是
break语句和 continue语句,这两条语句的基本功能如下:
● 当 break语句使用在循环体中的时候,其作用是能够在执行循环体的时候强迫终止循环,即控制程序的流程,使其提前退出循环,它的使用方法是
break;
● continue语句出现在循环体中的时候,其作用是能够中断本次的循环体运行,将程序的流程跳转到判断循环条件的语句处,继续下一次的循环,它的使用方法是
continue;
第三章 matlab 提高 计算机仿真与模拟例子 8 break语句示例 ——break_example.m。
001 i = 0;
002 j = 0;
003 k = 0;
004 for i = 1:2
005 for j = 1:2
006 for k = 1:2
007 if(k == 2)
008 disp('退出循环 ');
009 break;
010 end
第三章 matlab 提高 计算机仿真与模拟
011 str = sprintf('I = %d,J = %d,K = %d',i,j,k);
012 disp(str);
013 end
014 end
015 end
016 disp('程序运行结束 ');
第三章 matlab 提高 计算机仿真与模拟例子 8 的运行结果如下:
>> break_example
I = 1,J = 1,K = 1
退出循环
I = 1,J = 2,K = 1
退出循环
I = 2,J = 1,K = 1
退出循环
I = 2,J = 2,K = 1
退出循环程序运行结束第三章 matlab 提高 计算机仿真与模拟
break语句的作用是退出当前的循环结构运行,所以在例子 8中,位于最内层循环的 break语句执行的结果是退出了最内层的循环 k,位于外层的循环 i和 j还是都运行完毕了 。
第三章 matlab 提高 计算机仿真与模拟例子 9 continue语句示例。
001 i = 0;
002 for i =1:6
003 if(i>3)
004 continue
005 else
006 str = sprintf('I = %d',i);
007 disp(str);
008 end
009 end
010 str = sprintf('循环结束 I = %d',i);
011disp(str);
第三章 matlab 提高 计算机仿真与模拟例子 9的运行结果如下:
>> continue_example
I = 1
I = 2
I = 3
循环结束 I = 6
continue语句的作用在例子 9中得到了充分说明,该语句终止当前的循环,然后继续下一次循环运算,直到所有的循环迭代运算结束为止。
第三章 matlab 提高 计算机仿真与模拟
2.4 提高运算性能
M语言和其他的高级语言不同,由于采用了解释型语言,
所以 M语言的执行效率肯定低于编译型语言 (例如 C语言 )。 然而,
随着 MATLAB版本的不断升级,再加之合理利用 MATLAB向量运算等特点可以较大幅度地提高 M语言代码的执行效率 。 在本小节结合一些具体的例子来讲述 M语言编程以及 MATLAB软件本身在提高程序执行效率方面的一些特性 。
第三章 matlab 提高 计算机仿真与模拟
1,向量化运算
MATLAB最初的目的是提供便利的矩阵数据操作能力。所以在大多数的应用程序中,不要使用循环结构操作矩阵的元素,
应直接使用矩阵元素的索引或者矩阵运算的函数,这样做不仅能够提高代码的执行效率,而且还能够提高程序的可读性,这就是所谓的向量化的运算,也就是说,尽量将使用 while循环或者 for循环的语句结构转换成等价的向量或者矩阵运算,以提高程序的运算速度,参见例子 10。
第三章 matlab 提高 计算机仿真与模拟例子 10 向量化运算 ——array_vs_loops.m。
001 Mass = rand(50,100000);
002 Length = rand(50,100000);
003 Width = rand(50,100000);
004 Height = rand(50,100000);
005
006 [rows,cols] = size(Mass);
007
008 disp([char(10),'使用数组运算,'])
009 tic
010 Density = Mass./(Length.*Width.*Height);
011toc
第三章 matlab 提高 计算机仿真与模拟
012
013 disp([char(10),'使用循环结构,'])
014 tic;
015 for I = 1:rows
016 for J = 1:cols
017 Density(I) = Mass(I,J)/(Length(I,J)*Width(I,J)*Height(I,J));
018 end
019 end
020 toc
第三章 matlab 提高 计算机仿真与模拟例子 10比较了循环结构和数组运算的执行效率,程序中分别在 010行使用数组运算和在 015~ 019行使用循环结构完成了同样的工作 。 程序的运行结果如下:
>> array_vs_loops
使用数组运算:
elapsed_time =
0.188000
使用循环结构:
elapsed_time =
0.796000
第三章 matlab 提高 计算机仿真与模拟
2,预分配存储空间另外一种能够提高运算效率的方法就是进行内存变量存储空间的预分配,首先察看例子 11。
例子 11 内存预分配的例子 —— pre_allocate.m。
001 disp([char(10),'使用内存预分配,'])
002 pre_allo = zeros(10000,1);
003 tic;
004 for I = 1:10000
005 pre_allo(I) = rand(1);
006 end
第三章 matlab 提高 计算机仿真与模拟
007 toc
008
009 disp([char(10),'不使用内存预分配,'])
010 tic;
011 for J = 1:10000
012 not_pre_allo(J) = rand(1);
013 end
014 toc
第三章 matlab 提高 计算机仿真与模拟例子 4-11的执行结果如下:
>> pre_allocate
使用内存预分配:
elapsed_time =
0.016000
不使用内存预分配,
elapsed_time =
0.141000
第三章 matlab 提高 计算机仿真与模拟上面两种不同的运算惟一的区别就是程序 002行,执行这行语句之后,MATLAB自动分配了 10 000个连续的内存空间用于存储数据,MATLAB将一次创建足够的存储空间,然后依次赋值 。 而后者 not_pre_alloc变量没有进行相应的操作,所以带来了两次运算结果的不同 。
在不使用内存预分配的运算中,MATLAB是如何进行操作的呢?
当 I=1时,MATLAB将使用一小块长度为一个单元大小的内存保存一位随机数 。
当 I=2时,MATLAB寻找一块两单元大小的内存区,一个单元放第一个随机数,第二个放另外一个随机数。
…
第三章 matlab 提高 计算机仿真与模拟当 I = 10000 时,MATLAB 寻找一块容纳 10000单元的内存区存放以前的 9999个随机数,同时把最新的一个随机数加入进去 。 代码运行的结果造成了存储空间的浪费,降低了程序的执行速度 。
所以,在编写 M语言程序的时候需要尽量使用内存的预分配,而少使用或者不使用数组内存空间的自动扩充方式。
MATLAB针对不同的数据类型有不同的内存预分配函数,见表
1。
第三章 matlab 提高 计算机仿真与模拟表 1 内存预分配函数数据类型 函 数 例 子数值数组 z e r o s Y = z e r o s( 1,1 0 0 0 0 )
元胞数组 c e ll
Y = c e ll ( 2,3 ) ;
Y { 1,3 } = z e r o s( 1,1 0 0 0 0 ) ;
Y { 2,3 } = 's tr in g '
结构数组 st r u c t,r e p m a t Y = r e p m a t( st r u c t( f ie ld,v a lu e ),2,3 )
第三章 matlab 提高 计算机仿真与模拟表 1中说明了不同数据类型所要使用的内存预分配函数,
其中结构类型的数组需要两个函数配合使用,利用 struct函数构造结构,而使用 repmat函数创建数组 。
对于非双精度类型的数据,例如整数类型或者单精度类型,
进行内存的预分配时,需要使用相应的构造函数或者类型转换函数,例如:
Y = int16(zeros(1:10000));
在上面的表达式中创建了连续的 10 000个 16位整数的存储空间 。
当预先分配的内存空间无法容纳数据时,则可以通过
repmat函数来扩充数组的存储空间 。
第三章 matlab 提高 计算机仿真与模拟
3,MATLAB加速器尽管利用了上述的特性可以明显提高 M语言的运行效率,
但是在同等条件下,M语言的效率还是无法和第四代高级编程语言的执行效率相媲美,于是,在 MATLAB 新版本中,新增加了 MATLAB性能加速器这样一个新特性。 MATLAB性能加速器能够明显改善循环结构、内建函数调用等方面的运行效率,特别是在处理循环迭代次数确定的 for循环结构中,其运算速度较早期的 MATLAB版本有很大的提高,在表 2中总结了 MATLAB
加速器能够发挥作用的 M语言元素。
第三章 matlab 提高 计算机仿真与模拟表 2 加速器能够影响的 M语言元素
M 语言元素 作 用 范 围 说 明数据类型
MA TLAB 性能加速器能够针对布尔类型 ( 逻辑数组 ),字符串类型,8 位、
16 位和 32 位整数类型 ( 包含有符号和无符号整数类型 ),双精度类型的数据运算进行性能加速数组构造
MA TLAB 性能加速器可以针对数组的构造 (s hap e) 进行加速,但是对于维数超过三的多维数组无能为力
for 循环结构对于具备下列特征的 for 循环结构能够进行性能加速,
循环迭代的索引是标量;
循环体是加速器支持的数据类型运算和 ( 或 ) 数组构造重组操作;
循环体内调用的函数都是 MA TL AB 的内 建函数选择结构对于关系表达式使用标量运算的选择结构,MA TL AB 性能加速器能够提高其执行的速度第三章 matlab 提高 计算机仿真与模拟表 3 性能加速器不起作用的 M语言元素
M 语言元素 说 明数据类型除了能够加速的数据类型以外,其他的数据类型例如单精度类型、元胞数组、结构数组,Jav a 类对象等数据参与的操作无法加速函数调用若在 M A T L AB 代码中调用了其他 M 或 MEX 函数,则性能加速器无法发挥作用多操作代码行若在一行代码中进行了多条语句操作,例如
x = a,na m e; for k= 1:10 000,sin(A (k)),en d; 这样的语句无法进行加速数据类型改变若在程序中对已经存在的变量修改了数据类型,则性能加速器不能发挥作用,例如
X = 23;
- ac ce ler ate d co de -,
X = 'A'; % 这行代码不能加速
- m ore a cc ele ra ted c ode -
复数常量若在运算中直接将 i 和 j 作为复数常量参与运算,例如 Y= 2+ 3 * i,则性能加速器不能发挥作用,正确的做法应该是写作 Y= 2 +3 i
第三章 matlab 提高 计算机仿真与模拟例子 12 性能加速器说明 ——jitaccel.m。
001 tic
002 A = rand(500000,1);
003 B = zeros(500000,1);
004 B(1) = A(1);
005 for i = 2:500000
006 B(i) = B(i-1) + A(i);
007 end
008 toc
第三章 matlab 提高 计算机仿真与模拟在 MATLAB 6.1中:
>> jitaccel
elapsed_time =
5.2780
在 MATLAB 6.5中:
>> jitaccel
elapsed_time =
0.0900
在 MATLAB 7.0中:
>> jitaccel
elapsed_time =
0.0310
第三章 matlab 提高 计算机仿真与模拟通过比较,可以看出 MATLAB性能加速器明显提高了程序的执行效率,在有些情况下,加速器使执行速度提高 10~ 100
倍 。
注意:
例子 12代码运算得到的时间和具体运行 MATLAB的计算机的性能有关,不同的计算机环境得到的计算结果不尽相同。
第三章 matlab 提高 计算机仿真与模拟
3 脚 本 文 件脚本文件是最简单的一种 M语言文件,在前面的例子中都使用了脚本文件。所谓脚本文件,就是由一系列的 MATLAB指令和命令组成的纯文本格式的 M文件,执行脚本文件时,文件中的指令或者命令按照出现在脚本文件中的顺序依次执行。脚本文件没有输入参数,也没有输出参数,执行起来就像早期的
DOS操作系统的批处理文件一样,而脚本文件处理的数据或者变量必须在 MATLAB的公共工作空间中。
第三章 matlab 提高 计算机仿真与模拟例子 13 脚本文件示例。
001 % 注释行
002 % M脚本文件示例
003 % "flower petal"
004 % 以下为代码行
005 % 计算
006 theta = -pi:0.01:pi;
007 rho(1,:) = 2*sin(5*theta).^2;
008 rho(2,:) = cos(10*theta).^3;
009 rho(3,:) = sin(theta).^2;
010 rho(4,:) = 5*cos(3.5*theta).^3;
第三章 matlab 提高 计算机仿真与模拟
011 for k = 1:4
012 % 图形输出
013 subplot(2,2,k)
014 plot(theta,rho(k,:))
015 end
016 disp('程序运行结束 !')
在 MATLAB命令行中运行该脚本文件:
>> script_example
程序运行结束 !
第三章 matlab 提高 计算机仿真与模拟图 2 例子 13脚本文件的运行结果第三章 matlab 提高 计算机仿真与模拟仔细察看例子 13的脚本文件,在脚本文件中,主要由注释行和代码行组成。 M文件的注释行需要使用 %定义符,在 %之后的所有文本都认为是注释文本,不过,M文件的注释定义符仅能影响一行代码,类似于 C++语言中的,//”。然而在 M语言中,没有类似 C语言的注释定义符,/*”和,*/”,所以无法一次定义多行注释。
第三章 matlab 提高 计算机仿真与模拟脚本文件中的代码行都是一些简单的 MATLAB指令或者命令,这些命令可以用来完成相应的计算处理数据、绘制图形结果的操作,也可以在脚本文件中调用其他的函数完成复杂的数学运算,在例子 13中就完成了这些工作。另外,在 MATLAB中还有一些指令用来处理程序和用户之间的交互,在表 4中进行了总结。
第三章 matlab 提高 计算机仿真与模拟表 4 脚本文件中常用的 MATLAB指令指 令 说 明
pause 暂停当前 M 文件的运行,按任意键继续
input 等待用户输入
keyboard
暂停当前 M 文件的运行,并将程序控制权交还给 MA TL AB 命令行,这时可以正常使用命令行,直到键入,re turn,并按回车键后,M 文件才继续运行
return 返回当前的函数或者命令行第三章 matlab 提高 计算机仿真与模拟
4 函 数 文 件
4.1 基本结构
M函数文件和脚本文件不同,函数文件不仅有自己特殊的文件格式,不同的函数还分别具有自己的工作空间。同其他高级语言类似,M函数文件也有局部变量和全局变量,参见例子
14。
第三章 matlab 提高 计算机仿真与模拟例子 14 函数文件示例 ——average.m。
001 function y = average(x)
002 % AVERAGE 求向量元素的均值
003 % 语法:
004 % Y = average(X)
005 % 其中,X 是向量,Y为计算得到向量元素的均值
006 % 若输入参数为非向量则出错
007
008 % 代码行
009 [m,n] = size(x);
010 % 判断输入参数是否为向量第三章 matlab 提高 计算机仿真与模拟
011 if (~((m == 1) | (n == 1)) | (m == 1 & n == 1))
012 % 若输入参数不是向量,则出错
013 error('Input must be a vector')
014 end
015 % 计算向量元素的均值
016 y = sum(x)/length(x);
第三章 matlab 提高 计算机仿真与模拟在 MATLAB命令行中,键入下面的指令运行例子 14的代码:
>> z = 1:99;
>> y = average(z)
y =
50
第三章 matlab 提高 计算机仿真与模拟
M语言函数文件具有下面的不同部分:
* 函数定义行。
* 在线帮助。
* 注释行。
* M语言代码。
第三章 matlab 提高 计算机仿真与模拟下面结合例子 14分别说明这些部分的构成。
函数定义行,例子 14的函数定义行为代码的 001行:
001 function y = average(x)
第三章 matlab 提高 计算机仿真与模拟这一行代码中包括关键字 function,函数输出参数 y,函数的名称 average和函数的输入参数 x。 需要注意的是函数的名称,
函数的名称定义要求必须以字符开头,后面可以用字符,数字和下划线的组合构成函数名称 。 MATLAB对函数名称的长度有限定,读者可以在自己的 MATLAB中,通过执行 namelengthmax
函数获取相应的数值 。 假设该函数返回的数值为 N,若函数的名称长度超过了 N,则 MATLAB使用函数名称的前 N个字符作为函数名称 。
一般推荐将函数名称用小写的英文字符表示,同时函数的
M文件名称最好和函数名称保持一致,若文件名称和函数名称不一致,则调用函数的时候需要使用文件名称而非函数名称。
第三章 matlab 提高 计算机仿真与模拟
M函数文件的在线帮助为紧随在函数定义行的注释行 。 在例子 4-14中,average函数的在线帮助为 002~ 006行的注释行 。
若在 MATLAB命令行中键入下面的指令:
>> help average
在 MATLAB的命令窗口中就会出现:
AVERAGE 求向量元素的均值语法:
Y = average(X)
其中,X是向量,Y为计算得到向量元素的均值若输入参数为非向量则出错第三章 matlab 提高 计算机仿真与模拟其中,在线帮助中比较重要而且特殊的是在线帮助的第一行,
在 MATLAB中将这行注释称为 H1帮助行,它是在线帮助的第一行,若使用 lookfor函数查询函数时,仅查询并显示函数的
H1帮助行,例如,在 MATLAB命令行中键入下面的指令:
>> lookfor average
在 MATLAB的命令窗口中就会出现:
AVERAGE 求向量元素的均值
MEAN Average or mean value,
…
第三章 matlab 提高 计算机仿真与模拟由于 H1帮助行的特殊作用,所以在用户自己定义 M函数文件时,一定要编写相应的 H1帮助行,对函数进行简明,扼要的说明或者解释 。
例子 14的 008,010,012,015行代码分别是程序具体的注释行,这些注释行不会显示在在线帮助中,主要原因就是这些注释行没有紧随在 H1帮助行的后面,其中 008行的注释与在线帮助之间有一个空行 。 其实从 008行开始一直到文件的结尾都是
M函数文件的代码行,这些代码行需要完成具体的算法,实现用户的具体功能 。 代码行就是用户开发的算法 M语言的实现 。
第三章 matlab 提高 计算机仿真与模拟
4.2 输入输出参数
M语言函数文件的输入,输出参数和其他高级语言的输入,
输出参数不同,在定义这些输入,输出参数的时候不需要指出变量的类型,因为 MATLAB默认这些参数都使用双精度类型,
这样可以简化程序的编写 。 而且在定义参数时,也没有确定输入参数的维数或者尺寸,也就是说,直接从参数上无法判断输入来的是标量,向量还是矩阵,只有通过程序内部的具体代码来加以判断 。
M语言的函数文件不仅可以有一个输入参数和一个返回值,
还可以为 M语言函数文件定义多个输入参数和多个输出参数,
见例子 15。
第三章 matlab 提高 计算机仿真与模拟例子 15 多个输入、输出参数的 M函数。
001 function [avg,stdev,r] = ourstats(x,tol)
002 % OURSTATS 多输入输出参数示例
003 % 该函数计算处理矩阵,得到相应的均值、
004 % 标准差和矩阵的秩
005 [m,n] = size(x);
006 if m == 1
007 m = n;
008 end
009 % Average
010 avg = sum(x)/m;
第三章 matlab 提高 计算机仿真与模拟
011% Sandad deviation
012 stdev = sqrt(sum(x.^2)/m - avg.^2);
013 % Rank
014 s = svd(x);
015 r = sum(s > tol);
运行例子 15,在 MATLAB命令行中,键入下面的指令:
>> A = [ 1 2 3; 4 5 6]
A =
1 2 3
4 5 6
第三章 matlab 提高 计算机仿真与模拟
>> [a,s,r] = ourstats(A,0.1)
a =
2.5000 3.5000 4.5000
s =
1.5000 1.5000 1.5000
r =
2
>> ourstats(A,0.1)
ans =
2.5000 3.5000 4.5000
>> [a,s] = ourstats(A,0.1)
a =
2.5000 3.5000 4.5000
s =
1.5000 1.5000 1.5000
第三章 matlab 提高 计算机仿真与模拟例子 15的 M代码具有两个输入参数,三个输出参数,所以在使用该函数的时候,需要将必要的输入,输出参数写明 。 注意调用该函数时的语法,将输出参数依次写在一个向量中,若输出参数的个数与函数定义的输出参数个数不一致,则在例子
15中,将计算得到的前几个输出参数作为返回值,个数等于用户指定的输出参数个数 。 计算的结果依次赋值给不同的变量 。
在使用多个输入、输出参数的时候,往往需要判断用户写明的输入、输出参数的个数,若个数与函数定义不符合的时候,
将给出错误或者警告信息,这个时候,需要使用函数 nargin和
nargout来获取函数的输入、输出参数个数,见例子 16。
第三章 matlab 提高 计算机仿真与模拟例子 16 nargin和 nargout示例。
001 function c = testarg(a,b)
002 %TESTARG 检测输入输出参数个数
003 % 该函数根据不同的输入输出参数个
004 % 数进行相应的操作
005 if (nargout ~= 1)
006 disp('使用该函数必须指定一个输出参数 !');
007 return
008 end
009 switch nargin
010 case 0
第三章 matlab 提高 计算机仿真与模拟
011 disp('使用该函数至少需要一个输入参数 !');
012 c = [];
013 return
014 case 1
015 c = a.^2;
016 case 2
017 c = a+b;
018 end
第三章 matlab 提高 计算机仿真与模拟运行例子 16,在 MATLAB命令行窗口中,键入下面的指令:
>> A = [1 2 3];
>> B = [ 2 3 5];
>> testarg(A,B)
使用该函数必须指定一个输出参数 !
>> C = testarg
使用该函数至少需要一个输入参数 !
C =
[ ]
>> C = testarg(A)
C =
1 4 9
第三章 matlab 提高 计算机仿真与模拟
>> C = testarg(A,B)
C =
3 5 8
>> C = testarg(A,B,C)
Error using ==> testarg
Too many input arguments,
第三章 matlab 提高 计算机仿真与模拟运行例子 16的代码时,使用不同的输入,输出参数,函数本身和 MATLAB系统将自动检测参数的个数,在最后一次调用时,由于使用的输入参数个数超过了函数定义的个数,所以
MATLAB给出了错误信息 。
MATLAB的 M函数文件还可以具有个数不确定的输入、输出参数,也就是说,在定义 M函数文件的时候,不指明输入、
输出参数的个数,而是在程序中通过编写程序完成具体参数的确定,完成该功能主要依靠 varargin和 varargout函数。
第三章 matlab 提高 计算机仿真与模拟当函数的定义具有以下形式的时候
function y = function_name(varargin)
函数 function_name可以接受任意个数的输入参数;而当函数具有下面的形式时
function varargout = function_name(n)
函数 function_name可以输出任意个数的输出参数 。
可以将 varargin函数和 varargout函数结合在同一个 M文件函数中使用。
第三章 matlab 提高 计算机仿真与模拟例子 17 不确定的输入参数个数。
001 function y = varargin_example(varargin)
002 %VARARGIN_EXAMPLE 不确定输入参数例子
003 str = sprintf('输入参数的个数,= %d',length(varargin));
004 disp(str);
005 y = 0;
006 % varargin的类型
007 class(varargin)
008 for i = 1:length(varargin)
009 %varargin为元胞数组第三章 matlab 提高 计算机仿真与模拟
010 if(isnumeric(varargin{i}))
011 % 将每个为数值数组的输入参数
012 % 的第一个元素累加求和
013 y = y + varargin{i}(1);
014 end
015 end
第三章 matlab 提高 计算机仿真与模拟运行例子 17,在 MATLAB命令行中键入下面的指令:
>> varargin_example
输入参数的个数,= 0
ans =
cell
ans =
0
>> varargin_example('a',[1 2 3],3,rand(2,5))
输入参数的个数,= 4
ans =
cell
ans =
4.0153
第三章 matlab 提高 计算机仿真与模拟通过例子 17的运行结果和例子的代码可以看出 varargin函数的使用方法 。 它相当于在 MATLAB的函数入口处开辟了足够大的空间,用于接受各种用户的输入 。 在使用这个函数的时候,
需要在程序中判别函数输入参数的类别,并且从元胞数组中正确提取变量,在 MATLAB中将这一过程称之为 unpacking。
与之相对应的,将函数的输入参数传递给 varargout函数被称之为 packing,在这一过程中,需要将所有必要的输出参数传递给 varargout元胞数组,在传递参数的时候,还需要注意参数的顺序,在例子 18中介绍了这一过程。
第三章 matlab 提高 计算机仿真与模拟例子 18 不确定的输出参数。
001 function varargout=varargout_example(varargin)
002 %VARARGOUT_EXAMPLE不确定个数的输出参数
003
004 % 判断输出参数的个数
005 % 下面注释行中的代码执行有错误
006 % str = sprintf('输出参数的个数,=%d',length(varargout));
007 % 必须使用 nargout
008 str = sprintf('输出参数的个数,=%d',nargout);
009 disp(str);
010 if(nargout <= nargin)
011 for k=1:nargout
012 varargout{k} = varargin{nargin-k+1};
013 end
014 end
第三章 matlab 提高 计算机仿真与模拟运行例子 18的代码,在 MATLAB命令行中,键入下面的指令:
>> [a b] = varargout_example(1,2,3,4)
输出参数的个数,=2
a =
4
b =
3
第三章 matlab 提高 计算机仿真与模拟例子 18的第 006行代码,若将注释行符号,%”删除,则程序运行会出现错误 。 在程序中,若需要判断输出参数的个数不能使用 length函数,而需要使用 nargout函数 。 另外,在操作输出参数时,需要判断输出参数的个数,根据输出参数的个数完成相应的操作 。
在使用不确定的输入,输出参数时,还可以像下面的代码行一样使用这两个参数:
function [out1,out2] = example1(a,b,varargin)
function [i,j,varargout] = example2(x1,y1,x2,y2,flag)
若使用 varargout和 varargin参数,除了必须给定的参数以外,
其余的参数是任意数量可变的,具体的操作参阅例子 19。
第三章 matlab 提高 计算机仿真与模拟例子 19 可变的输入、输出参数。
001 function [x,y,varargout] = vararginout(a,b,c,d,varargin)
002 %VARARGINOUT 可变的输入输出参数
003 str = sprintf('输入参数的个数,=%d',nargin);
004 disp(str);
005 str = sprintf('输出参数的个数,=%d',nargout);
006 disp(str);
007 if(nargin <=4)
008 error('输入参数必须多于 4个 ');
009 end
010 % 处理输入输出参数第三章 matlab 提高 计算机仿真与模拟
011 x = a+b+c+d;
012 y = a-b+c-d;
013 if(nargout >2 && nargin>4)
014 for(i =1:nargout-2)
015 % 这里也许会出错,小心!
016 varargout{i} = varargin{end-i-1};
017 end
018 end
第三章 matlab 提高 计算机仿真与模拟运行例子 19的代码,在 MATLAB命令行中,键入下面的指令:
>> vararginout(1,2,3,4,5)
输入参数的个数,=5
输出参数的个数,=0
ans =
10
>> [a,b,c]=vararginout(1,2,3,4,5,6,7,8)
输入参数的个数,=8
输出参数的个数,=3
a =
10
b =
-2
c =
6
第三章 matlab 提高 计算机仿真与模拟
4.3 子函数和私有函数同一个 M函数文件中可以包含多个函数。如果在同一个 M
函数文件中包含了多个函数,那么将出现在文件中的第一个 M
函数称为主函数 (primary function),其余的函数称为子函数
(subfunction)。 M函数文件的名称一般与主函数的名称保持一致,
其他函数都必须按照函数的基本结构来书写,每一个函数的开始都是函数定义行,函数的结尾是另一个函数的定义行的开始或者整个 M文件的结尾 (最后一个子函数的结尾就是文件结束符 )。不过,子函数不像主函数,一般子函数没有在线帮助,子函数的作用范围有限,它只能被那些在定义子函数的 M文件中定义的函数 (包括主函数和其他子函数 )调用,不能被其他 M文件定义的函数调用。
第三章 matlab 提高 计算机仿真与模拟例子 20 子函数应用例子。
001 function [avg,med] = newstats(u) % 主函数
002 % NEWSTATS 计算均值和中间值
003 n = length(u);
004 avg = mean(u,n); % 调用子函数
005 med = median(u,n); % 调用子函数
006
007 function a = mean(v,n) % 子函数
008 % 计算平均值
009 a = sum(v)/n;
010
第三章 matlab 提高 计算机仿真与模拟
011 function m = median(v,n) % 子函数
012 % 计算中间值
013 w = sort(v);
014 if rem(n,2) == 1
015 m = w((n+1)/2);
016 else
017 m = (w(n/2)+w(n/2+1))/2;
018 end
第三章 matlab 提高 计算机仿真与模拟运行例子 20,在 MATALB命令行窗口中,键入下面的指令:
>> x = 1:11;
>> [mean,mid] = newstats(x)
mean =
6
mid =
6
第三章 matlab 提高 计算机仿真与模拟在 MATLAB中有一类函数被称为私有函数,这类函数被放置在名称为 private的子目录中。每一个函数文件都是标准的 M语言函数文件,没有特殊的关键字。但是,这些函数仅能被那些位于
private子目录的上一层目录中的函数调用。例如,假设在
MATLAB的搜索路径中包含路径 \ProjectA,那么所有位于
\ProjectA\private路径下的函数,只能在其上一层路径 \ProjectA中的函数文件中调用。由于私有函数作用范围的特殊性,不同父路径下的私有函数可以使用相同的函数名。由于 MATLAB搜索函数时优先搜索私有函数,所以如果同时存在私有函数名 func1.m和非私有函数名 func1.m,则私有函数 func1.m被优先执行。
创建私有函数的方法非常简单,只要将那些需要设置为私有的函数都拷贝到一个 private子目录中,则这些函数就能被那些位于父层目录中的 M函数调用了。
第三章 matlab 提高 计算机仿真与模拟在表 4中总结了子函数和私有函数的区别。
表 4 私有函数和子函数比较函数类型 子 函 数 私 有 函 数作用范围 同一个 M 函数文件内 在上层路径中的函数文件内结构保存在同一个 M 语言函数文件中,在 M
语言文件可以不包含任何子函数保存在子目录 p ri v a te 下第三章 matlab 提高 计算机仿真与模拟例子 21 私有函数的例子。
创建一个新的函数文件,代码如下:
001 function x = pmean(v,n)
002 %MEAN 私有函数例子
003 % 将该函数文件保存在 pivae子目录中,
004 % 则该函数仅能在上层目录的函数文件
005 % 中调用
006 disp('私有函数 mean');
007 x = sum(v)/n;
第三章 matlab 提高 计算机仿真与模拟图 3 将 pmean.m文件保存在 private目录下第三章 matlab 提高 计算机仿真与模拟接着,修改 newstats函数,并将其另存为 newstats1.m。
001 function [avg,med] = newstats1(u) % 主函数
002 % NEWSTATS 计算均值和中间值
003 n = length(u);
004 avg = mean(u,n); % 调用子函数
005 avg1 = pmean(u,n) % 调用私有函数
006 med = median(u,n); % 调用子函数
007
008 function a = mean(v,n) % 子函数
009 % 计算平均值
010 disp('子函数 mean');
011 a = sum(v)/n;
012,.....
第三章 matlab 提高 计算机仿真与模拟然后在 MATLAB命令行中,执行 newstats1.m函数:
>> newstats1(1:10);
子函数 mean
avg =
5.5000
私有函数 mean
avg1 =
5.5000
第三章 matlab 提高 计算机仿真与模拟
4.4 局部变量和全局变量同 C语言类似,在 M语言函数中也存在局部变量和全局变量 。 所谓局部变量,就是那些在 M函数内部声明并使用的变量 。
这些变量仅能在函数调用执行期间被使用,一旦函数结束运行,
则这些变量占用的内存空间将自动被释放,变量的数值也就不存在了 。 这是由于 MATLAB的解释器在解释执行函数的时候,
为不同的函数创建不同的工作空间,函数彼此的工作空间相互独立,一旦函数执行完毕,则函数的工作空间就不存在了 。
在前面的例子中,每个例子的函数内部声明使用的变量都是局部变量,所以函数执行完毕后,MATLAB的基本工作空间中没有这些变量存在,参见例子 22。
第三章 matlab 提高 计算机仿真与模拟例子 22 局部变量的例子。
001 function local
002 %LOCAL 察看局部变量的例子
003 x = rand(2,2);
004 y = zeros(2,2);
005 z = '函数中的变量 ';
006 u = {x,y,z};
007 disp(z)
008 whos
第三章 matlab 提高 计算机仿真与模拟运行例子 22,在 MATLAB命令行中,键入下面的指令:
>> local
函数中的变量
Name Size Bytes Class
u 1x3 256 cell array
x 2x2 32 double array
y 2x2 32 double array
z 1x6 12 char array
Grand total is 31 elements using 332 bytes
>> whos
第三章 matlab 提高 计算机仿真与模拟通过运行 local函数可以看到,所有在函数中创建的变量在函数运行结束后就不存在了 。 也就是说,局部变量的生存周期仅在函数的活动期间内 。
与局部变量相对应的就是全局变量 。 MATLAB将全局变量保存在特殊的工作空间进行统一维护,管理,而将变量声明为全局变量的方法就是在使用变量前,用关键字 global声明,例如声明全局变量 gXY:
>> global gXY
>> whos
Name Size Bytes Class
gXY 0x0 0 double array (global)
Grand total is 0 elements using 0 bytes
第三章 matlab 提高 计算机仿真与模拟需要强调一点,MATLAB管理,维护全局变量和局部变量使用了不同的工作空间,所以使用 global关键字创建全局变量的时候有三种情况:
(1) 若声明为全局的变量在当前的工作空间和全局工作空间都不存在,则创建一个新的变量,然后为这个变量赋值为空数组,该变量同时存在于局部工作空间和全局工作空间 。
(2) 若声明为全局的变量已经存在于全局工作空间中,则不会在全局工作空间创建新的变量,其数值同时赋值给局部工作空间中的变量 。
(3) 若声明为全局的变量存在于局部工作空间中,而全局工作空间不存在,则系统会提示一个警告信息,同时将局部的变量“挪”到全局工作空间中。
第三章 matlab 提高 计算机仿真与模拟例子 23 全局变量的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>>% 创建全局变量并赋值
>> global myx
>> myx = 10;
>>% 变量的信息
>> whos
Name Size Bytes Class
myx 1x1 8 double array (global)
Grand total is 1 element using 8 bytes
第三章 matlab 提高 计算机仿真与模拟
>>% 清除变量
>> clear myx
>>% 察看信息
>> whos
>> whos global
Name Size Bytes Class
myx 1x1 8 double array (global)
Grand total is 1 element using 8 bytes
>>% 在局部工作空间再次创建变量
>> myx = 23
myx =
23
>>% 变量的信息第三章 matlab 提高 计算机仿真与模拟
>> whos
Name Size Bytes Class
myx 1x1 8 double array
Grand total is 1 element using 8 bytes
>>% 将其修改为全局变量 (注意警告信息 )
>> global myx
Warning,The value of local variables may have been changed to match the
globals,Future versions of MATLAB will require that you declare
a variable to be global before you use that variable.
>>%看看变量的数值
>> myx
myx =
10
第三章 matlab 提高 计算机仿真与模拟
>>% 清除当前的工作空间
>> clear
>> whos global
Name Size Bytes Class
myx 1x1 8 double array (global)
Grand total is 1 element using 8 bytes
>>% 清除所有的内存空间
>> clear all
>> whos global
第三章 matlab 提高 计算机仿真与模拟使用全局变量时,需要小心留意,因为全局变量可以在任何的函数中进行读写,这样,可能在比较复杂的程序中查找全局变量错误的时候就非常的麻烦 。
在 MATLAB中还有一类变量被声明为 persistent,将其称之为保留变量,这类变量类似于 C语言函数中被声明为 static类型的变量 。 这类变量在函数退出的时候不被释放,当函数再一次被调用的时候,这些变量保留上次函数退出时的数值 。 被声明为 persistent的变量具有以下特征:
* 变量仅能在声明变量的函数内使用,其他函数不能直接使用这些变量 。
* 函数执行退出后,MATLAB不清除这些变量占用的内存 。
* 当函数被清除或者重新编辑后,保留的变量被清除。
第三章 matlab 提高 计算机仿真与模拟例子 24 persistent关键字。
001 function y = persistent_example(x)
002 %PERSISTENT_EXAMPLE 保留变量使用示例
003 for i = 1:x
004 y = myfun;
005 end
006
007 function y = myfun
008 % 子函数
009 % persistent关键字的使用
010 persistent count;
第三章 matlab 提高 计算机仿真与模拟
011 % count记录函数调用的次数
012 if( isempty(count))
013 count = 1;
014 else
015 count = count + 1;
016 end
017 str = sprintf('第 %d次调用该函数 ',count);
018 disp(str);
019 y = count;
第三章 matlab 提高 计算机仿真与模拟在 MATLAB命令行窗口中,执行该函数:
>> persistent_example(2)
第 1次调用该函数第 2次调用该函数
ans =
2
>> persistent_example(3)
第 3次调用该函数第 4次调用该函数第 5次调用该函数
ans =
5
第三章 matlab 提高 计算机仿真与模拟从例子 24的执行情况可以看出变量 count记录了函数被调用的次数,如果在 MATLAB命令行中键入如下指令:
>> clear all
则所有的变量都会被清除,此时再次执行例子 24:
>> persistent_example(3)
第 1次调用该函数第 2次调用该函数第 3次调用该函数
ans =
3
count数值又重新计数了。
第三章 matlab 提高 计算机仿真与模拟由于使用全局变量有这样那样的危险性,所以建议尽量使用函数参数传递的方式来完成函数之间的数据共享,或者可以使用 persistent关键字将必要的变量保护起来。另外,
isglobal 命令可以用来测试本地变量与全局工作区中的变量是否存在联系,该命令并不能判断全局工作区中是否存在该变量。如果全局工作区中存在某个变量,但与本地工作区中的相应变量没有联系,isglobal函数返回值为 0 (假 )。
第三章 matlab 提高 计算机仿真与模拟
4.5 函数执行规则只要在 MATLAB的命令行窗口中键入函数的名称,并且提供足够的输入,输出参数就会得到正确的结果 。 如前文所述,
M语言的函数被 MATLAB的解释器解释,执行,所以,在本小节中将简要讨论一下解释器解释执行程序的问题 。
当用户在 MATLAB命令行窗口键入一条命令或者执行 M语言文件中包含的一条语句或者指令时,MATLAB解释器就负责解析用户的输入,并且给出相应的答案。 MATLAB解释器解析命令按照一定优先级进行:
第三章 matlab 提高 计算机仿真与模拟
* 首先判断输入的命令是否为变量 。
* 若不是内存中的变量,判断输入的命令是否为 MATLAB
的内建函数 。
* 若不是内建函数,则判断输入的命令是否为子函数 。
* 若不是子函数,则判断输入的命令是否为私有函数 。
* 若不是私有函数,则判断输入的命令是否为 MATLAB搜索路径中所包含的某个文件或函数 。
* 若在同一个路径下发现同名的三种类型的文件 MEX文件、
P代码文件和 M代码文件,则优先执行 MEX文件,其次是 P代码文件,最后执行的是 M语言文件。
第三章 matlab 提高 计算机仿真与模拟提示:
若需要了解具体调用的是哪一个对象,则可以使用 which命令获取相应的信息 。
这里需要注意的一点就是,MATLAB内存中的变量比函数具有较高的优先级,如例子 25所示。
第三章 matlab 提高 计算机仿真与模拟例子 25 MATLAB命令解析的优先级。
在 MATLAB命令行窗口中,键入下面的指令:
>> cos = 'This is a string!'
cos =
This is a string!
>> cos(4)
ans =
s
>> which cos
cos is a variable,
第三章 matlab 提高 计算机仿真与模拟
>> clear all
>> cos(4)
ans =
-0.6536
>> which cos
cos is a built-in function.
通过例子 25说明,MATLAB命令解释器在解释、执行
MATLAB指令时,将变量置于第一位。
第三章 matlab 提高 计算机仿真与模拟提示:
P代码 (伪代码 )文件是从 M 文件用 pcode命令生成的 。 伪代码是经过预编译的,无论何时函数被调用,MATLAB都能访问的现成代码 。 因为 P 文件是预编译过的,所以它们的实际内容对用户而言是不可读的,而且在一般情况下它们比相应的 M
文件运行速度快 。 将 M语言函数文件转变为 P代码文件的方法是
>> pcode fun1 fun2.........
MEX文件是一种特殊的文件格式,主要使用 C语言进行开发,并且经过编译后在 MATLAB环境中使用,关于 MEX文件的详细信息将在,MATLAB外部接口编程,一书中详细讨论。
第三章 matlab 提高 计算机仿真与模拟
4.5 M 文 件 调 试
M语言文件的编辑器 ——meditor不仅仅是一个文件编辑器,
同时还是一个可视化的调试开发环境 。 在 M文件编辑器中可以对
M脚本文件,函数文件进行调试,以排查程序的错误 。 M文件的调试不仅可以在文件编辑器中进行,而且还可以在命令行中结合具体的命令进行,但是过程相对麻烦一些,所以本小节将重点讲述在 M文件编辑器中进行可视化调试的过程 。
一般地来说,应用程序的错误有两类,一类是语法错误,另外一类是运行时的错误。其中,语法错误包括了词法或者文法的错误,例如函数名称的拼写错误等。而运行时的错误是指那些程序运行过程中得到的结果不是用户需要的情况。但是,由于 M文件是一种解释型语言,语法错误和运行时的错误都只有在运行过程中才能发现,所以程序的调试往往是在程序无法得到正确结果时进行程序修正的惟一手段。
第三章 matlab 提高 计算机仿真与模拟为了能够有效地处理各种情况,M语言的断点类型除了类似 C语言的用户定义的断点外,还有几种自动断点,分别为
* Stop if Error。
* Stop if Warning。
* Stop if NaN or Inf。
* Stop if All Errors。
这些自动断点可以在程序中设置,当程序运行过程中发生了错误或者警告,则程序运行中断,进入调试状态。
第三章 matlab 提高 计算机仿真与模拟图 4 M文件编辑器的 Debug菜单第三章 matlab 提高 计算机仿真与模拟例子 26 M文件调试代码 ——stats_error.m。
001 function [totalsum,average] = stats_error (input_vector)
002 % STATS_ERROR - Calculates cumulative total & average
003 totalsum = sum(input_vector);
004 average = ourmean(input_vector);
005
006 function y = ourmean (x)
007 % OURMEAN - Calculates average
008 [m,n] = size(x);
009 if m == 1
010 m = n;
011 end
012 y = sum(input_vector)/m;
第三章 matlab 提高 计算机仿真与模拟首先在 MATLAB环境中启动 M文件编辑器,然后选择 M文件编辑器中,Debug”菜单下的,Stop if Error/warrning”命令 。
注意,这时不一定需要将 stats_error.m文件在文件编辑器中打开 。
然后,在 MATLAB命令行窗口中键入下面的指令:
>> [sum avg] = stats_error(rand(1,50))
Undefined function or variable 'input_vector'.
Error in ==> stats_error>ourmean at 12
y = sum(input_vector)/m;
第三章 matlab 提高 计算机仿真与模拟图 5 处于调试状态的 M文件编辑器第三章 matlab 提高 计算机仿真与模拟在 M文件编辑器中,第 12行代码前有绿色的箭头,表示当前程序运行在此处中断 。 通过用户界面中的 Stack下拉框可以察看当前应用程序使用堆栈的状态,如本例子中 Stack下拉框中包含如下的内容,ourmean,stats_error和 Base,由下至上,
分别为调用者和被调用者之间的关系,同时也显示了当前的工作空间 。 另外,部分按钮从编辑状态进入调试状态,如图 4-6
所示 。
这些按钮分别执行增加断点、清除断点、单步执行等调试程序的功能。将鼠标光标移动到按钮处并保持几秒钟,
MATLAB的文件编辑能够给出相应的提示。
第三章 matlab 提高 计算机仿真与模拟图 4-6 调试程序的按钮第三章 matlab 提高 计算机仿真与模拟此时,MATLAB命令行窗口也处于调试状态,在这种状态下命令行提示符为,K>>”,在该命令行提示符中可以任意键入
MATLAB指令进行运算和处理,不过需要注意,此时的工作空间是函数正在应用的空间,若在命令行窗口中键入的指令影响了工作空间中的变量,则可以直接影响程序运行的结果 。
例如,在当前的提示符,K>>”键入下面的指令:
K>> whos
Name Size Bytes Class
m 1x1 8 double array
n 1x1 8 double array
x 1x50 400 double array
Grand total is 52 elements using 416 bytes
第三章 matlab 提高 计算机仿真与模拟可以看到,当前的工作空间下没有变量名 input_vector,这也是该程序执行出错的原因,将程序中第 12行的 input_vector修改成为 x就能得到正确的答案了 。
MATLAB可视化程序调试功能相对于 Visual C++的可视化调试功能弱了一些,但是,在调试程序的过程中通过 MATLAB
命令行窗口的配合,充分利用 MATLAB命令行窗口,演算纸,
的功能,能够非常方便地调试 M语言应用程序 。
另外,MATLAB也提供了一些指令用于进行 M文件的调试,
在表 5中对这些命令进行了总结。
第三章 matlab 提高 计算机仿真与模拟表 5 应用与调试 M文件的指令指 令 说 明
dbc lea r 清除已经设置好的断点
dbc ont 继续执行,等同于工具栏中的 按钮
dbd ow n/db up 修改当前工作空间的上、下文关系
dbq uit 退出调试状态
dbsta ck 显示当前堆栈的状态
dbsta tus 显示所有的已经设置的断点
dbste p 执行应用程序的一行或者多行代码
dbsto p 设置断点
dbty pe 显示 M 文件代码和相应的行号第三章 matlab 提高 计算机仿真与模拟其中,比较常用的指令是 dbquit,在可视化调试过程中,往往会出现没有退出调试状态就关闭了 M文件编辑器的情况,这时可以在,K>>”提示符下键入该指令退出调试状态。另外,在
startup.m文件中利用 dbstop指令预先设置自动断点为有效,这样就不必每次在调试应用程序前设置自动断点了。
第三章 matlab 提高 计算机仿真与模拟
4.6 M文件性能分析使用 M文件性能分析器有两种方法,其中一种方法是通过命令行,另外一种方法是通过图形用户界面 。 本小节分别介绍这两种使用 M文件性能分析器的方法 。
本小节用来分析的程序为例子 10 向 量 化 运 算 ——
array_vs_loops.m的代码 。
使用性能分析器的图形用户界面,通过执行 MATLAB的
,Start”菜单中,MATLAB”子菜单下的,Profiler”命令,得到性能分析器的用户界面,如图 7所示。
第三章 matlab 提高 计算机仿真与模拟图 7 性能分析器的图形用户界面第三章 matlab 提高 计算机仿真与模拟图 8 性能分析的总结报告第三章 matlab 提高 计算机仿真与模拟图 9 性能分析的详细报告 —— 执行次数报告第三章 matlab 提高 计算机仿真与模拟详细分析报告主要按照不同的项目统计了程序的执行,其中包括运行时间 (Time)、语句调用次数 (Number of Call)、覆盖率 (Coverage)、已加速的代码 (Acceleration)。从分析报告中就可以得出占用了较多计算处理时间的代码段或代码行。另外,通过性能分析器的报告也能看出使用数组运算大大提高了 M文件的执行性能。
第三章 matlab 提高 计算机仿真与模拟注意:
另外一种进行性能分析的方法是直接利用命令行的方式进行,这里主要用到一个函数 ——profile,该函数的主要使用方法为
profile keywords
其中,根据不同的关键字执行不同的功能,而使用的过程大体分为三个步骤:
首先,在 MATLAB命令行中键入下面的指令:
>> profile on
其中,关键字 on的作用是开启性能分析器,并且将前面的统计结果清除。
第三章 matlab 提高 计算机仿真与模拟注意:
当性能分析器处于开启状态时,MATLAB的状态栏显示
,Profile on”。
其次,运行需要分析的 M文件,例如,本小节使用的
array_vs_loops.m文件 。 运行文件的方法和正常运行 M文件的方法一致:
>> array_vs_loops
第三步,也就是最后一步,在 MATLAB命令行中键入下面的指令:
>> profile report
这时 MATLAB将分析的结果创建为一个超文本格式的文档,
该文档就是性能分析的总结文档,如图 10所示。
第三章 matlab 提高 计算机仿真与模拟图 10 性能分析结果第三章 matlab 提高 计算机仿真与模拟通过单击相应的超链接可以获取相应文件的分析报告,
其主要内容为每一行代码执行占用的时间。和使用图形用户界面的性能分析器相比较,这个分析报告的内容相对简单。
第三章 matlab 提高 计算机仿真与模拟图 11 性能分析的详细报告第三章 matlab 提高 计算机仿真与模拟表 6 profile函数的使用方法语 法 说 明
pr of ile o n 开启性能分析器,同时清除上一次的统计信息
pr of ile o f f 关闭性能分析器
pr of ile r e po rt 关闭性能分析器,同时输出超文本的报告
pr of ile p lo t 关闭性能分析器,同时以柱状图绘制统计结果
pr of ile r e su m e 重新开启性能分析器,保留前一次的统计结果
pr of ile c le a r 清除统计结果
pr of ile v ie w e r 打开图形界面的性能分析器
S = p ro fil e ( ‘ sta tu s ’ ) 将性能分析器的状态 保存在结构 S 中
S = p ro fil e ( ‘ in fo ’ ) 关闭性能分析器,同时将分析结果保存在结构 S 中第三章 matlab 提高 计算机仿真与模拟
7 小 结在本章主要讲述了关于如何利用 MATLAB的编程语言 ——
M语言进行编程的方方面面。 MATLAB提供了一种高级编程语言 —— M语言,这种语言的语法结构与 C语言非常类似,任何熟悉 C语言的用户学习使用 M语言都不会有任何障碍。尽管 M
语言是一种解释性的编程语言,但是随着 MATLAB版本的不断升级,以及充分利用 MATLAB提供的各种编程技巧,能够有效提高 M语言应用程序的执行效率,使 M语言成为了工程领域中最适合进行算法开发验证的编程语言。
第三章 matlab 提高 计算机仿真与模拟通过上面的学习之后,应该能够比较熟练地利用 M语言实现自己的想法 。 MATLAB是灵活,可靠的开发环境,用户不仅可以利用已有的 MATLAB的功能,而且还能够利用 M语言丰富
MATLAB的能力 。 通过学习,还能够充分利用 MATLAB新版本特性,以及 MATLAB丰富的编程调试工具 ——调试器和性能分析器,编写出高效率可靠的应用程序 。
第三章 matlab 提高 计算机仿真与模拟
3.2 图形基础
1 概述
2 基本二维绘图
3 格式化绘图
4 特殊图形函数
5 基本三维绘图
6 保存和输出图形
7 数据插值和曲线拟合第三章 matlab 提高 计算机仿真与模拟
1 概 述数据的可视化是 MATLAB的强大功能之一,而这仅仅是
MATLAB图形功能的一部分,MATLAB的图形功能主要包括数据可视化,创建用户图形界面和简单数据统计处理等,其中,
数据的可视化不仅仅是二维的,还可以在三维空间展示数据,
而数据或者图形的可视化也是进行数据处理或者图形图像处理的第一步骤 。
MATLAB的图形都是绘制在 MATLAB的图形窗体中的,而所有图形数据可视化的工作也都以图形窗体为主。 MATLAB图形窗体如图 1所示。
第三章 matlab 提高 计算机仿真与模拟图 1 MATLAB的图形窗体第三章 matlab 提高 计算机仿真与模拟
MATLAB的图形窗体主要包括如下几个部分:
* 菜单栏,MATLAB的图形窗体一般包括一个菜单栏,
利用这个菜单栏可以完成对窗体中各种对象的基本操作,例如图形的打印导出等 。
* 工具条:图形窗体的工具条用来完成对图形对象的一般性操作,例如新建,打开,保存和打印,还有对图形窗体的编辑也是通过该工具条完成的 。
* 绘图区域:图形窗体的绘图区域是面积最大的一部分,
在图 1中就是绘制了 MATLAB标志的矩形区域。在这个区域中可以绘制各种曲线,显示图形图像文件,以及完成对图形图像或者曲线的编辑。
第三章 matlab 提高 计算机仿真与模拟一般地,在 MATLAB中进行数据可视化的过程主要有如下步骤:
* 准备需要绘制在 MATLAB图形窗体中的数据 。
* 创建图形窗体,并且选择绘制数据的区域 。 一个
MATLAB图形窗体可以包含多个绘图区域 。
* 使用 MATLAB的绘图函数绘制图形或者曲线 。
* 设置曲线的属性,例如线型,线宽等 。
* 设置绘图区域的属性,并且添加数据网格线 。
* 为绘制的图形添加标题,轴标签或者标注文本等 。
* 打印或者导出图形。
第三章 matlab 提高 计算机仿真与模拟
2 基本二维绘图
2.1 基本绘图指令在 MATLAB中进行数据可视化使用最频繁的绘制函数就是
plot函数,该函数能够将向量或者矩阵中的数据绘制在图形窗体中,并且可以指定不同的线型和色彩 。 同一个 plot函数不仅能够绘制一条曲线,还可以一次绘制多条曲线 。
plot函数的基本使用语法格式为绘制一条曲线,plot(xdata,ydata,'color_linestyle_marker')
绘制多条曲线,plot(xdata1,ydata1,'clm1',xdata2,ydata2,
'clm2',......)
第三章 matlab 提高 计算机仿真与模拟例子 1 MATLAB基本绘图指令的使用 。
在 MATLAB命令行窗口中键入下面的指令:
>> x = 0:pi/1000:2*pi;
>> y = sin(2*x+pi/4);
>> plot(x,y)
例子 1共有三条指令,前面两条是准备绘制的数据,x和 y
两个变量为长度相同的行向量,其中 y是利用三角函数处理的数据。而 plot函数使用默认的设置将数据 x和 y绘制在图形窗体中。系统默认的设置为蓝色的连续线条。绘制的图形如图 2所示。
第三章 matlab 提高 计算机仿真与模拟图 2 在 MATLAB图形窗体中绘制蓝色曲线
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6 7
第三章 matlab 提高 计算机仿真与模拟
plot函数能够同时绘制多条曲线,在 MATLAB命令行窗口中,键入下面的指令:
(继续前面的指令 )
>> plot(x,y,x,y+1,x,y+2)
第三章 matlab 提高 计算机仿真与模拟图 3 绘制多条曲线第三章 matlab 提高 计算机仿真与模拟在图形窗体中,由下至上分别为绘制的第一,二,三条曲线,根据系统的默认设置分别为蓝色,绿色和红色 。
例子 1说明了 plot函数的基本用法,同时也说明了 plot函数的系统默认设置 。 不过例子中使用的数据是两个向量,分别作为 X轴的数据和 Y轴的数据 。 那么对于 MATLAB是如何处理的呢?
利用 plot函数可以直接将矩阵的数据绘制在图形窗体中,
这个时候 plot函数将矩阵的每一列数据作为一条曲线绘制在窗体中,如例子 6-2所示。
第三章 matlab 提高 计算机仿真与模拟例子 2 利用 plot函数绘制矩阵数据。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = pascal(5)
A =
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 35
1 5 15 35 70
>> plot(A)
第三章 matlab 提高 计算机仿真与模拟图 4 绘制矩阵的数据
1 1,5 2 2,5 3 3,5 4 4,5 5
0
10
20
30
40
50
60
70
第五列数据第一列数据第三章 matlab 提高 计算机仿真与模拟
2.2 设置曲线的样式属性为了能够在 plot函数中控制曲线的样式,MATLAB预先设置了不同的曲线样式属性值,分别控制曲线的色彩、线型和标识符,在表 1中对 plot函数的标识符进行了总结。
第三章 matlab 提高 计算机仿真与模拟表 1 plot函数的标识符色彩 color 说明 时标 ma rker 说明 线型 linestyl e 说明
r 红色 + 加号 - 实线
g 绿色 o 圆圈 -- 虚线
b 蓝色 * 星号,点线
c 青,点 - 。 点划线
m 洋红 x 十字
y 黄色 s 矩形
k 黑色 d 菱形
w 白色 ^ 上三角
v 下三角
> 右三角
< 左三角
p 五边形
h 六边形第三章 matlab 提高 计算机仿真与模拟例子 3 设置曲线的样式。
在 MATLAB命令行窗口中,键入下面的指令:
>> t = 0:pi/20:2*pi;
>> y = sin(t);
>> y2 =sin(t-pi/2);
>> y3 = sin(t-pi);
>> plot(t,y,'-.rv',t,y2,'--ks',t,y3,':mp')
第三章 matlab 提高 计算机仿真与模拟例子 3在同一个图形窗体中绘制三条不同的曲线,为了区分这些曲线,使用了不同的时标、色彩和线型,绘制的曲线如图 5所示。
图 5 使用不同的样式绘制曲线
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6 7
第三章 matlab 提高 计算机仿真与模拟提示:常用的绘图命令为了能够更加直观地观察数据曲线,可以使用 grid命令将轴的坐标线绘制出来,具体的做法为 grid on。
执行该命令后,图形窗体的轴将显示坐标网格线,图 6就是将例子 3的结果添加上坐标网格线之后的效果。
第三章 matlab 提高 计算机仿真与模拟图 6 绘制坐标网格线
7
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6
第三章 matlab 提高 计算机仿真与模拟若不希望出现坐标网格线,则可以执行 grid off命令 。 执行
grid命令,图形窗体的轴将在有网格线和无网格线之间切换 。
若需要向已经存在曲线的图形窗体中增加曲线,则可以使用 hold on命令锁定当前的图形窗体,之后所有绘图操作的结果都会显示在当前的图形窗体中 。 使用 hold off命令则解除锁定状态,这时候任何绘图操作都将清除当前图形窗体已经绘制的内容 。 单纯使用 hold命令则将在锁定与非锁定状态之间切换 。
清除当前图形窗体内容的指令为 clf。创建新的图形窗体的指令为 figure。
第三章 matlab 提高 计算机仿真与模拟若不希望将绘制的曲线点连接起来,则在使用 plot函数绘制曲线的时候不要指定线条的样式,仅指定时标选项和色彩选项,这时就不会将绘制的点用线连接起来了 。 例如接例子 3执行下面的指令:
>> plot(t,y,'rv',t,y2,'ks',t,y3,'mp')
>> grid on
得到的图形如图 7所示。
第三章 matlab 提高 计算机仿真与模拟图 7 仅绘制曲线点
0
-1
- 0,8
- 0,6
- 0,4
- 0,2
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6 7
第三章 matlab 提高 计算机仿真与模拟
MATLAB还允许对利用 plot函数绘制的曲线进行更细致的控制,不过需要通过设置曲线的属性来完成 。 MATLAB图形对象都有自己的属性,通过修改属性就可以修改图形曲线的外观,
这也是句柄图形和图形用户界面操作图形对象的方法 。 绘制曲线时,可以通过修改下列属性完成对曲线细节的设置:
* LineWidth:曲线的宽度,单位为 point。
* MarkerEdgeColor:曲线时标边缘的色彩 。
* MarkerFaceColor:填充曲线时标的色彩 。
* MarkerSize:曲线时标的大小,单位为 point。
第三章 matlab 提高 计算机仿真与模拟例子 4 设置曲线的细节属性 。
在 MATLAB命令行窗口中,键入下面的指令:
>> x = -pi:pi/10:pi;
>> y = tan(sin(x)) - sin(tan(x));
>> plot(x,y,'--rs','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
例子 4中设置了曲线的线宽,Marker的填充色、边缘色等属性,于是得到的绘图结果如图 8所示。
第三章 matlab 提高 计算机仿真与模拟图 8 设置曲线的细节属性
-4 -3 -2 -1 0 1 2 3 4
-3
-2
-1
0
1
2
3
第三章 matlab 提高 计算机仿真与模拟
2.3 使用子图
MATLAB的图形窗体中不仅可以包含一个轴,还可以划分为多个图形显示区域,每个图形显示区域彼此独立,用户可以根据自己的需要把数据绘制在指定的区域中,这种特性就是利用 MATLAB图形窗体的子图功能来完成的 。 使用子图的方法非常简单,只要使用 subplot函数选择绘制区域即可 。
subplot函数把现有的图形窗体分割成指定行数和列数的区域,在每个区域内都可以包含一个绘图轴,利用该函数选择不同的绘图区,然后所有的绘图操作都将结果输出到指定的绘图区中。
第三章 matlab 提高 计算机仿真与模拟
subplot函数的基本用法如下:
subplot(m,n,p)
其中,m和 n为将图形窗体分割成的行数和列数,p为选定的窗体区域的序号,以行元素优先顺序排列 。
例如,在 MATLAB命令行窗口中键入指令:
>> subplot(2,3,4)
则 MATLAB将图形窗体分割成为二行三列,并且将第四个绘图区域设置为当前的绘图区域。例子 5说明了子图的使用方法。
第三章 matlab 提高 计算机仿真与模拟例子 5 使用子图 ——subplotex.m。
001 function subplotex
002 % 子图的使用示例
003 x = 0:.1:2*pi;
004 % 创建新的图形窗体
005 figure(1);clf;
006 % 分隔窗体为 2行 2列,分别在不同的区域绘图
007 subplot(2,2,1);plot(1:10);grid on;
008 subplot(2,2,2);plot(x,sin(x));grid on;
009 subplot(2,2,3);plot(x,exp(-x),'r');grid on;
010 subplot(2,2,4);plot(peaks);grid on;
第三章 matlab 提高 计算机仿真与模拟
011 % 子图的使用特别的用法
012 % 创建新的图形窗体
013 figure(2);clf
014 % 图形窗体分割为 4行 5列,选择第 2~4号区域
015 subplot(4,5,2:4);plot(1:10);grid on;
016 % 选择向量中指定的区域
017 subplot(4,5,[7 8 9 12 13 14]);plot(peaks);grid on;
018 % 选择单一的区域
019 subplot(4,5,11);plot(membrane);grid on;
020 % 选择多个区域
021 subplot(4,5,16:20);surf(membrane);grid on;
第三章 matlab 提高 计算机仿真与模拟注意在例子 5中,选择多个绘图区域时使用的 subplot函数的格式 。
运行例子 5的代码,在 MATLAB命令行窗口中,键入下面的指令:
>> subplotex
则 MATLAB创建两个图形窗体,分别绘制分割的图形,如图 9、
10所示。
第三章 matlab 提高 计算机仿真与模拟图 6-9 例子 5 代码 007行 ~010行的图形结果
0 5 10
0
2
4
6
8
10
0 2 4 6 8
-1
- 0,5
0
0,5
1
0 2 4 6 8
0
0,2
0,4
0,6
0,8
1
0 20 40 60
- 1 0
-5
0
5
10
第三章 matlab 提高 计算机仿真与模拟图 10 例子 6-5代码 014行 ~021行的图形结果
0 2 4 6 8 10
0
5
10
0 10 20 30 40 50
- 1 0
-5
0
5
10
0 20 40
-1
0
1
0
10
20
30
40
0
10
20
30
40
-1
0
1
第三章 matlab 提高 计算机仿真与模拟
2.4 控制绘图区域所谓 MATLAB的绘图区域是指图形窗体中的轴 (Axes),需要牢记一点,所有 MATLAB的图形对象都是绘制在轴的上面,
所以控制绘图的区域也就是控制轴的显示区域。利用 MATLAB
的图形功能绘制图形时,MATLAB自动地根据绘制的数据调整轴的显示范围,它能够保证将所遇的数据以适当的比例显示在轴中。用户同样可以修改轴显示的范围,而且还可以修改轴的标注,修改这些特性需要使用 axis函数,并且设置相应的属性。
第三章 matlab 提高 计算机仿真与模拟
axis函数可以修改图形窗体轴的范围,它的基本语法格式如下:
axis([xmin xmax ymin ymax])
其中,xmin和 xmax决定 X轴的显示范围,ymin和 ymax决定 Y轴的显示范围 。
若在 MATLAB命令行窗口中,直接键入下面的指令:
>> axis
ans =
0 1 0 1
则 MATLAB按照默认的设置自动创建一个图形窗体,包含一个空白的轴,其中 X轴的范围和 Y轴的范围都为 0~1。
第三章 matlab 提高 计算机仿真与模拟例子 6 axis函数使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> x = 0:pi/100:pi/2;
>> y = tan(x);
>> plot(x,y,'ko')
>> grid on
第三章 matlab 提高 计算机仿真与模拟图 11 自动比例设置的图形窗体内容
0
2
4
6
8
10
12
14
16
18
x 1 0
15
0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6
第三章 matlab 提高 计算机仿真与模拟可以看出,由于默认的图形窗体轴能够根据数据的范围自动调节图形显示的比例,所以图 11显示的结果并不是那么直观,
绘制的数据几乎排成了一条直线,所以需要修改显示范围 。
>> axis([0,pi/2,0,5])
该命令将图形窗体轴的范围缩小,这时,前面数据的细节就可以很容易地查看出来了,如图 12所示 。
axis函数除了能够用来直接设置轴的范围外,还能够用来设置轴的行为,例如设置轴是否按照数据的范围自动调节等,
具体的用法请参阅 MATLAB的帮助文档或者在线帮助。
第三章 matlab 提高 计算机仿真与模拟图 12 设置轴的属性以查看数据的细节
0
0,5
1
1,5
2
2,5
3
3,5
4
4,5
5
0 0,5 1 1,5
第三章 matlab 提高 计算机仿真与模拟绘制曲线的轴还需要设置坐标线之间的间隔 (Ticks),在默认的情况下,MATLAB按照绘制数据的范围设置坐标线的间隔,
这种间隔的设置是自动完成的,用户也可以根据自己的需要设置这些间隔,具体的方法是通过设置轴的 XTick或者 YTick属性实现对 X轴或者 Y轴的坐标间隔设置,这里举例说明。
第三章 matlab 提高 计算机仿真与模拟例子 7 设置轴的坐标间隔。
在 MATLAB命令行窗口中,键入下面的指令:
>> x = -pi:pi/10:pi;
>> y = cos(x);
>> plot(x,y,'-r^');
>> grid on
第三章 matlab 提高 计算机仿真与模拟图 13 绘制曲线使用默认的坐标线间隔
-4 -3 -2 -1 0 1 2 3 4
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
默认的 X轴间隔第三章 matlab 提高 计算机仿真与模拟修改轴的坐标间隔属性,需要使用 set函数修改指定对象的 XTick或者 YTick属性值 。 在本例子中,修改 X轴的范围和坐标间隔:
>> axis([-pi,pi,-inf,inf])
>> set(gca,'XTick',-pi:pi/4:pi)
这时 MATLAB的图形窗体如图 14所示。
第三章 matlab 提高 计算机仿真与模拟图 14 设置坐标间隔线和坐标范围
- 3,1 4 1 6 - 2,3 5 6 2 - 1,5 7 0 8 - 0,7 8 5 4 0 0,7 8 5 4 1,5 7 0 8 2,3 5 6 2 3,1 4 1 6
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
自定义的 X轴间隔第三章 matlab 提高 计算机仿真与模拟注意:
在设置坐标轴的范围时,若将坐标轴取值设定为 inf(如例子 7),则表示该坐标轴的范围为自动,也就是说,在本例子中
X轴的范围为 [-π,π],则 Y轴按照绘制数据的范围自动设定 。
提示:
set函数和 get函数是用来设置 /获取 MATLAB图形对象属性的常用函数。 MATLAB的图形对象都包含有不同的属性和相应的属性数值,这些属性和属性值直接决定了 MATLAB图形对象的表现形式。例如在例子 7中设置了轴对象的属性 —— XTick,
修改之后 X轴的坐标间隔发生了变化。
第三章 matlab 提高 计算机仿真与模拟继续例子 7,在 MATLAB命令行窗口中键入下面的指令:
>> label = {‘-pi','',‘-pi/2','','0','','pi/2','','pi'}
label =
Columns 1 through 6
'-pi' '' ‘-pi/2' '' '0' ''
Columns 7 through 9
'pi/2' '' 'pi'
>> set(gca,'XTickLabel',label)
第三章 matlab 提高 计算机仿真与模拟图 15 设置 X轴的标注
-1
-0,8
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0,8
1
-p i -p i / 2 0 p i / 2 pi
自定义 X轴标注第三章 matlab 提高 计算机仿真与模拟
2.5 图形编辑器
MATLAB不仅能够显示数据和图形,而且还可以利用图形窗体中的工具对图形对象进行编辑,这时的图形窗体需要进入到编辑模式 。 在编辑模式下,可以向图形窗体中的对象添加文本,箭头,直线等,还可以利用 MATLAB提供的编辑工具完成图形对象的编辑工作 。
进入图形编辑模式有以下几种方法:
* 执行图形窗体中,Tool”菜单下的,Edit Plot”命令 。
* 单击图形窗体工具栏中选择对象按钮壁 。
第三章 matlab 提高 计算机仿真与模拟
* 执行,Edit”菜单下的菜单命令或者,Insert”菜单下的菜单命令都可以进入编辑 模式 。
* 在 MATLAB命令行窗口中,键入,plotedit”指令 。
进入图形编辑模式后,可以向图形添加各种元素,完成工作后,只要单击按钮就可以回到正常的显示模式 。
图形编辑模式下比较重要的工作是设置各种图形对象的属性,这里以设置轴对象的属性为例来说明这一过程。
第三章 matlab 提高 计算机仿真与模拟例子 8 利用图形编辑模式编辑轴对象属性 。
本例子使用例子 7的指令绘制基本的图形,请参阅例子 7
和图 13。
首先进入图形编辑模式,利用前面介绍的不同方法都能够进入编辑模式,进入编辑模式后,用鼠标单击轴,这时图形窗口如图 16所示。
第三章 matlab 提高 计算机仿真与模拟图 16 进入图形编辑模式,并选择轴对象第三章 matlab 提高 计算机仿真与模拟这时可以利用不同的方式打开轴对象的属性编辑器:
* 执行,Edit”菜单下的,Axes Properties”命令 。
* 执行鼠标右键快捷菜单下的,Properties”命令 。
* 在 MATLAB命令行窗口中键入指令 propedit,在弹出的图形属性对话框中选择轴 对象 。
轴对象的属性编辑器如图 17所示。
第三章 matlab 提高 计算机仿真与模拟图 17 轴属性编辑器第三章 matlab 提高 计算机仿真与模拟在轴属性编辑器中,可以设置 X,Y和 Z轴的属性,以及有关绘图的其他属性 。 这里需要将 X轴的属性设置成例子 7的数值 。 需要修改的地方包括 Limit,Tick和 Labels。
第三章 matlab 提高 计算机仿真与模拟图 18 设置轴对象属性得到的结果
- p i- p i / 2 0 p i / 2 p i
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
第三章 matlab 提高 计算机仿真与模拟
3 格 式 化 绘 图
3.1 增加文本信息
MATLAB图形窗体的文本信息主要包括图形标题,文本注释,
轴标签和图例等,图 19中的 MATLAB图形窗体包含了所有这些文本信息 。
为图形窗体增加这些文本信息一般有多种途径,或者通过菜单命令,或者通过属性编辑器,或者使用 MATLAB提供的函数 。
MATLAB的图形窗体 Insert菜单下包含多个菜单命令可以用来添加这些格式化的文本信息,而通过 MATLAB图形编辑器,配合不同对象的属性编辑器也可以完成添加格式化文本信息的工作 。 不过这些方法都没有利用函数编写程序简便,灵活,所以重点介绍利用函数添加格式化文本信息的方法 。
第三章 matlab 提高 计算机仿真与模拟图 19 MATLAB图形窗体的格式化文本第三章 matlab 提高 计算机仿真与模拟
1,添加标题 (title)
添加图形的标题需要使用 title函数,该函数的基本用法为
title('string')
其中,字符串 string为图形窗体的标题,该标题将被自动地设置在轴的正中顶部,例如在 MATLAB命令行窗口中,键入下面的指令:
>> title(date)
则 MATLAB会创建包含一个空白轴的图形窗体,同时将轴的标题设置为当前的日期,如图 20所示。
第三章 matlab 提高 计算机仿真与模拟图 20 以当前日期为标题的轴第三章 matlab 提高 计算机仿真与模拟
2,添加图例 (legend)
图例作为绘制在轴的数据曲线的说明,默认绘制在轴的右上角处,其中包括了绘制在轴内曲线的色彩,样式和时标,同时在绘制图例的地方为每一个曲线添加简要的说明文字,便于用户了解数据曲线的信息 。 添加轴的图例需要使用函数 legend,
该函数的基本语法为
legend('string1','string2'......)
其中,字符串 string1,string2为图例的说明性文本,MATLAB
将自动地按照绘制在轴上的曲线的绘制次序选择相应的文本作为图例 。 例如,假设在图形窗体上绘制如例子 3所示的三条曲线,为这三条曲线增加图例 。 在 MATLAB命令行窗口键入下面的指令:
>> legend('y=sin(t)','y=sin(t-pi/2)','y=sin(t-pi)')
第三章 matlab 提高 计算机仿真与模拟图 21 增加图例
y = s i n ( t )
y = s i n ( t - p i / 2 )
y = s i n ( t - p i )
-1
-0,8
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6 7
图例第三章 matlab 提高 计算机仿真与模拟通过图例可以非常方便地了解绘制在图形窗体中的曲线的基本信息。图例所在的位置可以任意地挪动,可以用鼠标直接在图形窗体中移动图例的位置,也可以在创建图表的时候,直接利用 legend函数设置图表的不同位置。具体的方法请参阅 MATLAB的帮助文档中关于 legend函数的说明。另外,
还可以使用句柄图形的方法设置图例的位置。
第三章 matlab 提高 计算机仿真与模拟
3,添加坐标轴标签 (label)
在 MATLAB中坐标轴的标签可以用来说明与坐标轴有关的信息,坐标轴标签也可以包含各种需要添加的信息,例如坐标轴数据的单位,物理意义等 。 MATLAB可以为不同的坐标轴添加不同的坐标信息,一般地,可以使用 xlabel,ylabel和
zlabel函数分别为图形窗体的 X轴,Y轴和 Z轴添加轴标签 。 以
X轴为例,这三个函数的基本使用语法如下:
xlabel('string')
其中,string就是坐标轴的标签。坐标轴的标签自动与坐标轴居中对齐。
第三章 matlab 提高 计算机仿真与模拟例如在图形窗体中为 X轴和 Y轴添加标签:
>> plot(sin(0:pi/100:pi))
>> xlabel('X轴数据 ');ylabel('Y轴数据 ')
添加标签之后的图形窗体内容如图 22所示。
第三章 matlab 提高 计算机仿真与模拟图 22 添加坐标轴标签
0 20 40 60 80 100 120
X 轴数据
Y
轴数据
0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
1
坐标轴标签第三章 matlab 提高 计算机仿真与模拟
4,添加文本注释 (text)
文本注释是由创建图形的用户添加的说明行文字,这些文字可以用来说明数据曲线的细节特点,比如,需要特别注意的数据点 。 创建文本注释的时候可以将文本注释首先保存在元胞数组中,然后使用 text函数完成向图形窗体添加文本注释的工作 。
text函数的基本语法为
text(x,y,'string')
其中,x和 y是文本注释添加的坐标值,该坐标值使用当前轴系的单位设置,这个坐标也就是文本起始点的坐标。
第三章 matlab 提高 计算机仿真与模拟例如可以向图形窗体添加文本:
>> x = 0:.1:2*pi;y = sin(x);plot(x,y)
>> text(pi/3,sin(pi/3),'<--Sin(\pi/3)')
这里通过调用 text函数,把文本注释添加到了图形曲线上,
如图 23所示。
第三章 matlab 提高 计算机仿真与模拟图 23 添加文本注释
0 1 2 3 4 5 6 7
< - - S i n (? / 3 )
-1
-0,8
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0,8
1
文本注释第三章 matlab 提高 计算机仿真与模拟
3.2 格式化文本标注在 3.1小节的例子中添加的各种文本标注都使用了系统默认的字体、字号等属性设置,若是所有的图形文本注释都使用这些格式显得千篇一律,所以这些文本的属性也可以进行修改,
修改这些属性可以通过 set命令,而前提是需要获取相应图形对象的句柄。介绍创建格式化文本标注的方法。
第三章 matlab 提高 计算机仿真与模拟文本标注的字体属性可以在创建文本标注的时候进行设置,其中有关字体本身的属性包括:
* FontName:字体名称,例如 Courier,隶书等 。
* FontSize:字体大小,整数值,默认为 10 points。
* FontWeight:设置字体的加粗属性 。
* FontUnits:字体大小的度量单位,默认为 point。
可以在创建文本注释的同时就设置这些文本相应的属性值,
在例子 9中,分别设置了文本注释的这些属性。
第三章 matlab 提高 计算机仿真与模拟例子 9 添加格式化的文本信息 ——txtinfo.m。
001 %使用不同的文本标注属性
002 % 准备数据并绘制曲线
003 x = 0:.1:2*pi;y = sin(x);plot(x,y)
004 grid on;hold on
005 plot(x,exp(-x),'r:*');
006 % 添加标注
007 title('2-D Plots','FontName','Arial','FontSize',16)
008 % 使用中文字体第三章 matlab 提高 计算机仿真与模拟
009 xlabel('时间 ','FontName','隶书 ','FontSize',16)
010 % 加粗文本
011ylabel('Sin(t)','FontWeight','Bold')
012 % 修改字号
013 text(pi/3,sin(pi/3),'<--Sin(\pi/3)','FontSize',12)
014 legend('Sine Wave','Decaying Exponential')
015 hold off
执行脚本文件 txtinfo,在 MATLAB命令行窗口中键入下面的指令:
>> clear all
>> txtinfo
第三章 matlab 提高 计算机仿真与模拟得到的图形输出如图 24所示。
图 24 设置不同文本属性的文本标注
0 1 2 3 4 5 6 7
2 -D P l o t s
时间
S
i
n
(
t
)
< - - S i n (? / 3 )
S i n e W av e
D ec ay i n g E x p o n en t i al
-1
-0,8
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0,8
1
第三章 matlab 提高 计算机仿真与模拟
3.3 特殊字符标注在 3.1小节和例子 9中,都使用了特殊的字符集来显示字符
π,而显示字符 π的方法就是利用了 LaTeX字符集 。 利用这个字符集和 MATLAB文本注释的定义,就可以在 MATLAB的图形文本标注中使用希腊字符,数学符号或者上标和下标字体等 。
第三章 matlab 提高 计算机仿真与模拟在 MATLAB图形窗体的所有文本标注中都可以使用这些特殊的文本,比如在标题,坐标轴标签,文本注释中,使用特殊文本时一定要注意不要忘记,\”符号,否则 MATLAB就会按照普通文本处理这些字符 。 还可以用下面的标识符组合完成更丰富的字体标注 。
* \bf:加粗字体 。
\it:斜体字。
* \sl:斜体字 (很少使用 )。
* \rm:正常字体 。
* \fontname{fontname}:定义使用特殊的字体名称 。
* \fontsize{fontsize}:定义使用特殊的字体大小,单位为
FontUnits。
第三章 matlab 提高 计算机仿真与模拟设置字体的大小或者名称将直接影响接在定义符后面的文本内容,直到下一个字体定义符出现 。
进行上标或者下标文本的注释需要使用,_”和,^”字符 。
进行上标标注的方法如下:
^{superstring}
其中,superstring是上标的内容,它必须添加在大括号,{}”之中 。
进行下标标注时的标注方法如下:
_{substring}
其中,substring是下标的内容,它必须添加在大括号,{}”之中 。
关于在 MATLAB文本标注中添加特殊的文本的具体方法参见例子 10。
第三章 matlab 提高 计算机仿真与模拟例子 10 使用特殊文本标注 ——Latex_examp.m。
001 function latex_examp
002 %LATEX_EXAMP 在文本注释中使用特殊文本
003 alpha = -0.5;
004 beta = 3;
005 A = 50;
006 t = 0:.01:10;
007 y = A*exp(alpha*t).*sin(beta*t);
008 % 绘制曲线
009 plot(t,y);
010 %添加特殊文本注释第三章 matlab 提高 计算机仿真与模拟
011 title('\fontname{ 隶书 }\fontsize{16}{ 隶书 }
\fontname{Impact}{Impact}')
012 xlabel('^{上标 } and _{下标 }')
013 ylabel('Some \bf粗体 \rm and some \it{斜体 }')
014 txt = {'y = {\itAe}^{\alphax}sin(\beta\itt)',...
015 ['\itA\rm',' = ',num2str(A)],...
016 ['\alpha = ',num2str(alpha)],...
017 ['\beta = ',num2str(beta)]};
018 text(2,22,txt );
运行例子 10,在 MATLAB命令行窗口中键入指令:
>> latex_examp
第三章 matlab 提高 计算机仿真与模拟图 25 使用特殊文本注释
0 1 2 3 4 5 6 7 8 9 10
- 3 0
- 2 0
- 1 0
0
10
20
30
40
隶书 Im p a c t
上标
a n d
下标
S
o
m
e
粗体
a
n
d
s
o
m
e
斜体
y = Ae
x
s i n (? t)
A = 5 0
= - 0,5
= 3
第三章 matlab 提高 计算机仿真与模拟特殊文本注释可以放置在各种文本注释的内容中,在例子 10中,011~018行的代码分别在标题、坐标轴标签、文本注释内容中添加了特殊文本。注意,在需要添加多行文本注释的时候,需要将注释的内容保存在元胞数组中,元胞数组的每一个元胞即为注释的一行,就像 014行创建的变量 txt一样。
第三章 matlab 提高 计算机仿真与模拟
3.4 简单数据统计信息
MATLAB的图形窗体同时提供了简单数据统计的功能,这些功能是通过调用 MATLAB的基本数学函数完成的。不过在图形窗体中使用数据统计功能,可以将统计的结构直接绘制在
MATLAB图形窗体中,而且这些结果也能够保存到 MATLAB
的工作空间。
第三章 matlab 提高 计算机仿真与模拟例子 11 简单数据统计工具的基本用法。
本例子使用的脚本文件为 census_stats.m,该文件的内容如下:
001 % CENSUS_STATS 简单数据统计工具使用示例
002 % 加载数据,数据为 MATLAB自带的 DEMO
003 load census;
004 % 绘制曲线
005 plot(cdate,pop,'ko');
006 hold on;grid on;
007 legend('人口 ');
008 title('人口普查信息 ');
009 xlabel('时间 (年 )'); ylabel('人口数 (百万 )');
第三章 matlab 提高 计算机仿真与模拟提示:
本例子使用的数据来自于 MATLAB自带的 Demo,关于该
MATLAB自带例子的信息请参阅在线帮助,help census。
在 MATLAB命令行窗口中,键入下面的指令:
>> census_stats
这时得到的图形窗体内容如图 26所示。
第三章 matlab 提高 计算机仿真与模拟图 26 人口数据绘图
1 7 5 0 1 8 0 0 1 8 5 0 1 9 0 0 1 9 5 0 2 0 0 0
人口普查信息时间 ( 年 )
人口
0
50
1 0 0
1 5 0
2 0 0
2 5 0
人口数(
百万)
第三章 matlab 提高 计算机仿真与模拟为了进行简单数据统计,需要通过菜单命令。执行图形窗体,Tool”菜单下的,Data Statistics”命令,弹出数据统计对话框,如图 6-27所示。
图 6-27 数据统计对话框第三章 matlab 提高 计算机仿真与模拟在数据统计对话框中,对 X轴和 Y轴的数据进行了简要的统计计算,其中包括了最大值、最小值、均值、中值、标准差和取值范围。通过选择每一组数据边上的复选框,就可以将不同的统计计算结果绘制在图形窗体中,比如在例子 11中选择 Y轴数据的均值 (mean),这时的图形窗体如图 28所示。
第三章 matlab 提高 计算机仿真与模拟图 28 添加数据统计信息
1750 1800 1850 1900 1950 2000
0
50
100
150
200
250
人口普查信息时间 ( 年 )
人口数
(
百万
)
人口
y m e a n
第三章 matlab 提高 计算机仿真与模拟依此类推,可以将其他的统计结果绘制在图形中 。
单击数据统计对话框中的,Save to workspace”按钮可以将统计计算的结果保存到工作空间,在弹出的对话框中选择 Y
轴的数据,并且编辑变量名,如图 29所示。
第三章 matlab 提高 计算机仿真与模拟图 29 将统计结果保存到工作空间中第三章 matlab 提高 计算机仿真与模拟保存到工作空间的变量是一个结构:
>> whos
Name Size Bytes Class
cdate 21x1 168 double array
censusstats 1x1 792 struct array
pop 21x1 168 double array
Grand total is 54 elements using 1128 bytes
>> censusstats
censusstats =
第三章 matlab 提高 计算机仿真与模拟
min,3.9000
max,248.7000
mean,85.7286
median,62.9000
std,78.6011
range,244.8000
第三章 matlab 提高 计算机仿真与模拟关闭图形窗体的同时自动关闭数据统计工具。若图形窗体中绘制有多条曲线,则可以通过选择数据统计工具对话框的,Statistics for”下拉框中的不同数据进行统计分析。而且,
一旦打开数据统计工具对话框,则统计工具自动对图形窗体中的数据进行更新计算,若修改了图形窗体中的曲线,则统计工具自动重新进行计算,并绘制结果。
第三章 matlab 提高 计算机仿真与模拟
4 特殊图形函数
4.1 特殊坐标轴系
MATLAB为数据的 2D图形显示提供了很多函数,以下函数都是基本二维画线的函数,它们采用了不同的坐标刻度 ——
对数坐标系 。 因此在绘制特殊坐标轴系曲线的时候,需要分别使用不同的函数:
* loglog:两个坐标轴都使用对数刻度 。
* semilogx,x轴用对数刻度,y 轴用普通线性刻度 。
* semilogy,y轴用对数刻度,x轴用普通线性刻度。
第三章 matlab 提高 计算机仿真与模拟还有一个 plotyy函数,它能够将两组不相关的数据绘制在同一个图形窗体中,而且每一组数据都使用不同的 Y坐标系 。
例子 12 使用特殊的坐标轴系 。
执行包含下列代码的脚本文件:
001 %OTHER_AXES特殊坐标系示例
002 data = 1:1000;
003 subplot(2,2,1);loglog(data);grid on;
004 title('LOGLOG(1:1000)')
005 subplot(2,2,2);semilogy(data);grid on;
第三章 matlab 提高 计算机仿真与模拟
006 title('SEMILOGY(1:1000)');
007 subplot(2,2,3);semilogx(data);grid on;
008 title('SEMILOGX(1:1000)')
009 subplot(2,2,4);plotyy(data,data,data,data.^2);
010 grid on;
011 title('PLOTYY');
第三章 matlab 提高 计算机仿真与模拟图 30 使用特殊的坐标轴系第三章 matlab 提高 计算机仿真与模拟
4.2 绘制特殊图形在 MATLAB中能够绘制的特殊图形包括条状图和面积图、
饼图、柱状图、离散数据图、矢量方向图以及等高线图等,这些特殊图形的绘制一般都是通过一个函数的调用完成的。不同的特殊图形绘制函数应用面不同,需要根据特殊的数据可视化和统计要求选择。
第三章 matlab 提高 计算机仿真与模拟
1,条状图和面积图绘制条状图和面积图的函数如下:
* bar:绘制二维条状图,将 m行 n列的矩阵绘制成 m组,每组 n个垂直条 (bar)。
* barh:绘制二维水平条状图,将 m行 n列的矩阵绘制成 m
组,每组 n个水平条 (bar)。
* bar3:绘制三维条状图,将 m行 n列的矩阵绘制成 m组,
每组 n个垂直条 (bar)。
* barh3:绘制三维水平条状图,将 m行 n列的矩阵绘制成 m
组,每组 n个水平条 (bar)。
* area:绘制面积图,将向量数据绘制成面积图。
第三章 matlab 提高 计算机仿真与模拟执行包含下面代码的脚本文件能够得到如图 31所示的结果 。
001 %BAR_EXAMP条状图和面积图示例
002 data = [10 2 3 5; 5 8 10 3; 9 7 6 1; 3 5 7 2; 4 7 5 3];
003 subplot(2,2,[1 2]);bar(data);
004 title('垂直条状图 (2D)');
005 subplot(2,2,3);bar3h(data);
006 title('水平条状图 (3D)');
007 subplot(2,2,4);area(data);
008 title('面积图 ');
第三章 matlab 提高 计算机仿真与模拟图 31 条状图和面积图示例
1 2 3 4 5
0
2
4
6
8
10
垂直条状图 ( 2 D )
0
5
10
1
2
3
4
5
水平条状图 ( 3 D )
1 2 3 4 5
0
10
20
30
面积图第三章 matlab 提高 计算机仿真与模拟
2,饼图饼图用来显示向量或者矩阵元素占所有元素和的百分比 。
饼图也有二维饼图和三维饼图,绘制的函数分别为 pie和 pie3。
执行包含下面代码的脚本文件能够得到如图 32所示的结果 。
001 %PIE_EXAMP 饼图示例
002 A = sum(rand(5,5));
003 subplot(2,2,1);pie(A);
004 title('完整饼图 (2D)');
005 subplot(2,2,2);pie3(A);
006 title('完整饼图 (3D)');
007 B = [0.18 0.22 0.35];
第三章 matlab 提高 计算机仿真与模拟
008 subplot(2,2,3),pie(B);
009 title('缺角饼图 (2D)');
010 subplot(2,2,4),pie3(B);
011 title('缺角饼图 (3D)');
第三章 matlab 提高 计算机仿真与模拟图 32 饼图示例
2 6 %
2 0 %
2 0 %
1 8 %
1 7 %
完整饼图 ( 2 D )
2 0 %
1 8 %
完整饼图 ( 3 D )
1 7 %
2 0 %
2 6 %
1 8 %
2 2 %
3 5 %
缺角饼图( 2 D )
3 5 %
缺角饼图 ( 3 D )
2 2 %
1 8 %
第三章 matlab 提高 计算机仿真与模拟
3,柱状图柱状图 (直方图 )用来显示数据的分布情况,比如显示一组数据的概率分布情况 。 柱状图可以绘制在普通的直角坐标下,也可以绘制在极坐标下,使用的函数分别为 hist和 rose。
这两个函数分别计算输入向量中数据落入某一范围的数量,
而绘制的柱状高度或者长度则表示落入该范围的数据的个数 。
执行包含下列代码的脚本文件能够得到如图 33所示的结果 。
001 %HIST_EXAMP 柱状图示例
002 A = randn(100000,1);
003 B = rand(100000,1);
第三章 matlab 提高 计算机仿真与模拟
004 subplot(2,2,1);hist(A);
005 title('正态分布 ');
006 subplot(2,2,2);hist(B);
007 title('均匀分布 ');
008 subplot(2,2,3);rose(A);
009 title('正态分布 ');
010 subplot(2,2,4);rose(B);
011 title('均匀分布 ');
第三章 matlab 提高 计算机仿真与模拟
-5 0 5
0
1
2
3
4
x 1 0
4
正态分布
0 0,5 1
0
5 0 0 0
1 0 0 0 0
1 5 0 0 0
均匀分布
1 0 0 0 0
2 0 0 0 0
30
210
60
240
90
270
120
300
150
330
180 0
正态分布
2 0 0 0 0
4 0 0 0 0
30
210
60
240
90
270
120
300
150
330
180 0
均匀分布图 33 柱状图示例第三章 matlab 提高 计算机仿真与模拟
4,离散数据图在数字信号处理领域经常处理一些离散的数据,而
MATLAB提供了相应的函数供用户进行离散数据的绘制,例如常用的火柴杆图,阶梯图等 。 前面介绍的柱状图也是绘制离散数据的一种选择 。
绘制火柴杆图可以使用 stem函数或者 stem3函数,前者绘制二维空间的曲线,后者绘制三维空间的曲线,而阶梯图需要使用 stairs函数 。
例如绘制离散数据图的脚本文件 —— stem_examp如下:
第三章 matlab 提高 计算机仿真与模拟
001 %STEM_EXAMP离散数据图示例
002 alpha =,01; beta =,5; t = 0:0.2:10;
003 y = exp(-alpha*t).*sin(beta*t);
004 stem(t,y,'r');grid on;hold on;
005 stairs(t,y,'g');
006 plot(t,y,'b');
007 figure
008 theta = 2*pi*(0:127)/128;
009 x = cos(theta);
010 y = sin(theta);
011 z = abs(fft(ones(10,1),128))';
012 stem3(x,y,z)
第三章 matlab 提高 计算机仿真与模拟图 34 离散数据图示例
0 1 2 3 4 5 6 7 8 9 10
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
-1
- 0,5
0
0,5
1
-1
- 0,5
0
0,5
1
0
2
4
6
8
10
第三章 matlab 提高 计算机仿真与模拟注意:
在绘制三维火柴杆图的时候使用了快速傅立叶函数,该函数是数字信号处理常用的函数之一,为 MATLAB的内建函数 。
除了上述四种类型的特殊绘图函数以外,MATLAB还能够绘制矢量方向图和等高线图,这些函数包括
* compass,绘制放射线图 。
* feather:绘制线性放射线图 。
* quiver:绘制场图 。
* quiver3:绘制三维场图。
第三章 matlab 提高 计算机仿真与模拟
* contour:绘制等高线轮廓图。
* contour3:绘制三维等高线轮廓图。
* contourf:绘制填充的等高线图。
* clabel:标识等高线标签。
* meshc:绘制三维 mesh曲线和等高线。
* surfc:绘制三维 surf曲线和等高线。
第三章 matlab 提高 计算机仿真与模拟例如使用上述函数绘制特殊图形的脚本文件如下:
001 %OTHERS矢量方向图绘制示例
002 subplot(2,2,1)
003 [X,Y,Z] = peaks(-2:0.25:2);
004 [U,V] = gradient(Z,0.25);
005 contour(X,Y,Z,10);
006 hold on
007 quiver(X,Y,U,V);
008 title('表面梯度 - (CONTOUR & QUIVER)')
009 subplot(2,2,2)
第三章 matlab 提高 计算机仿真与模拟
010 contourf(X,Y,Z,10);
011 title('填充等高线 - (CONTOURF)')
012 theta = 0:0.1:4*pi;
013 [x,y] = pol2cart(theta(1:5:end),theta(1:5:end));
014 subplot(2,2,3)
015 compass(x,y)
016 title('放射线图 - (COMPASS)')
017 subplot(2,2,4)
018 feather(x(1:19),y(1:19))
019 title('线性放射线图 - (FEATHER)')
第三章 matlab 提高 计算机仿真与模拟图 35 特殊图形绘制示例第三章 matlab 提高 计算机仿真与模拟
6.5 基本三维绘图三维图形的表现能力要强于二维图形,在很多时候需要使用 MATLAB绘制三维图形的能力。 MATLAB提供了若干函数进行三维数据可视化,同时还有若干种方法进行三维图形对象属性的设置和控制。
第三章 matlab 提高 计算机仿真与模拟绘制三维图形的基本过程要比绘制二维图形复杂一些,基本过程如下:
(1) 准备需要绘制在 MATLAB图形窗体中的数据。
(2) 创建图形窗体,并且选择绘制数据的区域。
(3) 使用 MATLAB的 3D绘图函数绘制图形或者曲线。
(4) 设置调色板和投影算法。
(5) 增加光照,设置材质。
(6) 设置视点 (viewpoint)。
(7) 设置绘图坐标轴的属性。
(8) 设置透视比。
(9) 为绘制的图形添加标题、轴标签或者标注文本等。
(10) 打印或者导出图形。
第三章 matlab 提高 计算机仿真与模拟例子 6-14 简单三维绘图。
例子 6-14的脚本文件代码如下:
001 %PLOT_3D 简单三维绘图
002 % 准备数据
003 z = 0:0.1:40;
004 x = cos(z);
005 y = sin(z);
006 clf;
007 % 绘制曲线
008 plot3(x,y,z)
009 % 添加标注第三章 matlab 提高 计算机仿真与模拟
010 grid on
011 title('Spiral Plot - using PLOT3')
012 xlabel('x')
013 ylabel('y')
014 zlabel('z')
第三章 matlab 提高 计算机仿真与模拟图 6-40 简单的三维绘图第三章 matlab 提高 计算机仿真与模拟例子 6-14中使用了函数 plot3,该函数类似 plot函数,能够将 X,Y,Z坐标绘制在三维的空间,它的基本语法如下:
plot3(xdata,ydata,zdata,'clm',......)
在命令行中,clm的取值和 plot函数的取值完全一致 。
在例子 6-14的代码中,使用 zlabel函数向坐标轴添加标签,
它的用法类似于 xlabel和 ylabel函数 。
在例子 6-14中,没有进行其他复杂的操作,比如设置光线、
视点和三维实体的表面材质等特性。在例子 6-15中完整地演示了绘制三维曲面的过程。
第三章 matlab 提高 计算机仿真与模拟例子 6-15 绘制复杂的三维曲面。
例子 6-15使用的脚本文件如下:
001 %准备数据
002 Z = peaks(20);
003 %选择图形窗体
004 figure(1);clf
005 %调用 3D绘图函数
006 h = surf(Z);
007 %设置调色板和投影算法
008 colormap hot;
第三章 matlab 提高 计算机仿真与模拟
009 shading interp;
010 set(h,'EdgeColor','k')
011 %增加光照
012 light('Position',[-2,2,20])
013 lighting phong
014 %设置材质
015 material([0.4,0.6,0.5,30])
016 set(h,'FaceColor',[0 0.7 0.7],...
017 'BackFaceLighting','lit')
018 %设置视点第三章 matlab 提高 计算机仿真与模拟
019 view([30,25])
020 set(gca,'CameraViewAngleMode','Manual')
021 %设置轴属性
022 axis([0 20 0 20 -8 8])
023 set(gca,'ZTickLabel','Negative||Positive')
024 %设置透视比
025 set(gca,'PlotBoxAspectRatio',[2.5 2.5 1])
026 %添加文本注释
027 xlabel('X Axis');ylabel('Y Axis');zlabel('Function Value');
028 title('Peaks');
第三章 matlab 提高 计算机仿真与模拟图 6-41 代码运行的中间结果第三章 matlab 提高 计算机仿真与模拟图 6-42 程序运行的最终结果第三章 matlab 提高 计算机仿真与模拟在例子 6-15的代码中使用了很多三维图形属性设置的函数以及大量的图形对象属性,这些内容已经超出了本书的讨论范围,有兴趣的读者可以结合例子的代码阅读 MATLAB的帮助文档或者函数的在线帮助 。
为了便于绘制三维图形,MATLAB提供了一些函数用于特殊的三维曲面绘制,其中经常使用的函数有 mesh函数和 surf函数 。
mesh函数用来绘制三维的线框图,它的输入参数一般为 X、
Y和 Z三个坐标系的数据,同时该函数还有 meshc和 meshz函数两种变形,其中 meshc函数用来绘制具有等高线性质的 mesh曲面,meshz函数用于绘制 mesh曲面的参考面,这三个函数的使用参见例子 6-16。
第三章 matlab 提高 计算机仿真与模拟例子 6-16 mesh函数的应用。
例子 6-16的脚本文件包含下列代码:
001 % MESH_EXAMP mesh函数举例
002 % 准备数据
003 [X,Y] = meshgrid(-3:.125:3);
004 Z = peaks(X,Y);
005 subplot(1,3,1);
006 meshc(X,Y,Z);
007 axis([-3 3 -3 3 -10 5]);title('Meshc');
008 subplot(1,3,2);
009 meshz(X,Y,Z);
第三章 matlab 提高 计算机仿真与模拟
010 axis([-3 3 -3 3 -10 5]);title('MeshZ');
011 subplot(1,3,3);
012 mesh(X,Y,Z);
013 axis([-3 3 -3 3 -10 5]);title('Mesh');
014 colormap gray
015 set(gcf,'Position',[14 237 997 275]);
第三章 matlab 提高 计算机仿真与模拟图 6-43 mesh函数使用示例例子 6-16的运行结果如图 6-43所示。
第三章 matlab 提高 计算机仿真与模拟在例子 6-16中,使用了 meshgrid函数创建二维的网格数据 。
meshgrid函数可以用来创建三维曲线绘图的原始数据,它根据输入参数,创建等间距的网格数据 。 关于 meshgrid函数的详细信息请参阅 MATLAB的帮助文档或者函数的在线帮助 。
通过例子 6-16的运行结果能够明显地看出函数 mesh、
mehsc,meshz之间的区别 。 有关 mesh函数的详细使用方法请参阅 MATLAB的帮助文档 。
surf函数和 mesh函数不同,surf函数能够创建用色彩表示的曲面图,而不是线框图,而且该函数有一种变形,就是 surfc。
所以,若将例子 6-16的代码进行适当的修改,则得到的结果如图 6-44所示。
第三章 matlab 提高 计算机仿真与模拟
surf函数具体的使用请参阅 MATLAB的帮助文档或者函数的在线帮助。其他的三维曲线、曲面绘制函数就不再赘述了。
最后给出一个三维曲面的绘制示例,这里主要使用了 waterfall
函数,contour3函数和前面介绍过的 plot3函数。若对例子 6-17
使用的函数有所疑问,请参阅 MATLAB的帮助文档。
第三章 matlab 提高 计算机仿真与模拟图 6-44 surf函数使用示例第三章 matlab 提高 计算机仿真与模拟例子 6-17 其他三维绘图函数示例。
例子 6-17的脚本文件代码如下:
001 %SURF_3D 三维绘图函数示例
002 % 准备数据
003 x =?3:0.3:3; y = x;
004 [X,Y]=meshgrid(x,y);
005 [theat,R] = cart2pol(X,Y);
006 Z = sinc(R);
007 % 等高线
008 subplot(2,2,1)
009 contourf(peaks(30),10)
第三章 matlab 提高 计算机仿真与模拟
010 colorbar
011 grid on
012 title('Peaks Function - (CONTOURF & COLORBAR)')
013 % plot3函数绘制矩阵数据
014 subplot(2,2,2)
015 plot3(X,Y,Z)
016 grid on
017 axis([-3 3 -3 3 -1 1])
018 title('Sinc Function - (PLOT3)')
019 % waterfall函数,效果类似 surfz函数
020 subplot(2,2,3)
第三章 matlab 提高 计算机仿真与模拟
021 waterfall(membrane(1));
022 title('L-shaped Membrane - (WATERFALL)')
023 %三维等高线
024 subplot(2,2,4)
025 contour3(peaks(30),25);
026 title('Peaks Function - (CONTOUR3)')
027 colormap hsv
第三章 matlab 提高 计算机仿真与模拟图 6-45 三维绘图函数的应用示例第三章 matlab 提高 计算机仿真与模拟
6.6 保存和输出图形
6.6.1 保存和打开图形文件
MATLAB支持将图形文件保存成为二进制格式的文件 。 为此,MATLAB提供了一种类似于 MAT格式的文件用来保存
MATLAB的图形文件,这种文件的扩展名为 *.fig。 这种二进制的图形格式文件只能够在 MATLAB中使用 。
若需要将文件保存成为 fig格式的图形文件,则在图形窗体中选择,File”菜单下的,Save”命令,或者直接单击工具栏上的保存按钮,在弹出的对话框中选择保存类型为,fig,如图 6-46所示。
第三章 matlab 提高 计算机仿真与模拟在对话框中给定文件名称,然后单击,保存,按钮就可以保存文件了 。
打开文件的过程和保存文件的过程类似,都可以通过菜单命令或者工具栏的按钮完成操作 。
不过,MATLAB独具特色的就是为保存的图形文件提供了相应的命令,这个命令就是 saveas,该命令的一般语法结构如下:
saveas(h,'filename.ext');
saveas(h,'filneame','format');
第三章 matlab 提高 计算机仿真与模拟图 6-46 保存图形文件的对话框第三章 matlab 提高 计算机仿真与模拟其中,h为图形的句柄,例如可以直接使用 gcf指令获取当前的图形窗口的句柄; filename为保存的文件名,而 saveas命令根据 ext的不同将文件存成为不同的格式 。 在第二种命令行格式中,format直接说明文件的保存格式,它可以是图形文件的扩展名,或者是 m,或者 mfig,在取 m或者 mfig的时候,文件将被保存成为一个可调用的 M文件和相应的图形数据文件 。
打开图形文件就只要用 open命令就可以了,open函数会根据文件的扩展名不同而调用相应的辅助函数文件。例如在打开,fig图形文件时,调用 open命令,具体过程请参阅例子 6-18。
第三章 matlab 提高 计算机仿真与模拟例子 6-18 在命令行中保存打开图形文件 。
在 MATLAB命令行窗口中,键入下面的指令:
>> surf(peaks(30))
>> % 将图形文件保存为 M文件和 fig文件
>> saveas(gcf,'peakfile','M')
>> % 调用 M文件重新显示窗体
>> peakfile
>> % 使用 open指令打开文件
>> open('peakfile.fig')
第三章 matlab 提高 计算机仿真与模拟在上面的短短几行代码中,代码将图形文件保存成为了一个 M文件和一个 fig文件,其中 M文件的主要内容是:
001 function h = peakfile
002 [path,name] = fileparts(which(mfilename));
003 figname = fullfile(path,[name '.fig']);
004 if (exist(figname,'file')),open(figname),else
open([name '.fig']),end
005 if nargout > 0,h = gcf; end
在文件中,不可缺少的就是大量的注释信息,而 M文件的代码主要保证了可靠地打开保存的图形文件。最后的 open命令能够完成同样的功能。
第三章 matlab 提高 计算机仿真与模拟
6.6.2 导出文件尽管保存,fig文件非常方便,但是,fig文件却只能够在
MATLAB中使用,所以 MATLAB的图形窗口还可以将图形文件保存成其他的特殊图形格式文件。在表 6-3中列举了能够直接在图形窗体中导出的图形文件类型。
第三章 matlab 提高 计算机仿真与模拟表 6-3 MATLAB支持的图形文件格式文件类型 扩展名 文件类型 扩展名增强型图元文件 e m f T IF F 图形文件 tif
位图 bm p T IF F 格式非压缩文件 tif
E P S 文件 e ps 便携式网络图像格式 png
E P S 色彩文件 e ps 24 位位图文件 pc x
E P S 二级文件 e ps 便携式位图 pbm
E P S 二级色彩文件 e ps 便携式灰度图 pgm
A dob e Il lus tr a tor 文件 ai 便携式像素图 ppm
JP E G 图形文件 jpg
第三章 matlab 提高 计算机仿真与模拟若需要将图形文件保存成表 6-3列举的各种类型文件,需要执行图形窗体,File”菜单下的,Export”命令,然后在对话框中选择需要导出的图形文件格式,最后给出相应的文件名,
单击“保存”按钮后完成操作,对话框如图 6-47所示。
第三章 matlab 提高 计算机仿真与模拟图 6-47 导出文件对话框第三章 matlab 提高 计算机仿真与模拟在前面小节介绍的 saveas指令中,也可以使用这些扩展名来保存图形文件 。 例如将图形文件保存成为 tiff格式的文件,命令行为
saveas(h,filename,'tif');
MATLAB提供了另外一个功能强大的命令来保存图形文件,
这个命令就是 print命令 。
从直观上看,print命令的作用是将图形文件通过打印机输出,它也支持将图形文件保存成其他格式的图形文件或者数据文件,这些图形文件不仅仅是那些在表 6-3中列出的图形文件,
而且还有更多的格式可以被支持,例如 PostScript格式的文件等。
第三章 matlab 提高 计算机仿真与模拟
MATLAB还提供了一个名为 printopt的 M文件,该文件主要可以由系统管理员编辑,以指明缺省的打印机类型和打印目标,当调用它时,返回缺省值的打印命令和设备选项,例如在
Windows系统下执行该命令:
>> [pcmd,dev] = printopt
pcmd =
COPY /B $filename$ $portname$
dev =
-dwin
第三章 matlab 提高 计算机仿真与模拟
print命令的基本使用方法如下:
print -device -options filename
在命令行中,device 和 options的选取有很多选项,而
device可以是某种 MATLAB支持的打印驱动,也可以是某种图形文件格式 。 由于受篇幅的限制这里就不一一解释说明了,请读者参阅 MATLAB的帮助文档,doc print。
若将图形文件输出到打印机,则使用以下命令行:
>> print
这时 print命令就可以直接将图形文件输出到当前系统默认的打印机。
第三章 matlab 提高 计算机仿真与模拟将图形输出成为 PostScript文件,可以指定相应的设备,例如:
>> print -dps filename
可以将图形文件保存为黑白的 PS文件,而命令行:
>> print -dpsc filename
可以将图形文件保存为彩色的 PS文件。
第三章 matlab 提高 计算机仿真与模拟
6.6.3 拷贝图形文件在 Windows操作系统中,可以将图形窗体中的内容拷贝到剪贴板上,然后可以将剪贴板上的内容拷贝到任何一个
Windows应用程序中。拷贝图形时,不是简简单单地按下快捷键 Ctrl+C就可以了,而是需要通过图形窗体,Edit”菜单下的
,Copy Figure”命令来完成,如图 6-48所示。
第三章 matlab 提高 计算机仿真与模拟图 6-48 拷贝图形的菜单命令第三章 matlab 提高 计算机仿真与模拟这时拷贝下来的图形粘贴出来的效果类似前面章节图 6-24
的效果。可以通过选择,MATLAB”菜单下的,Reference”命令,
在弹出的对话框中对控制拷贝图形效果的选项参数进行设置,
如图 6-49所示。
第三章 matlab 提高 计算机仿真与模拟图 6-49 设置拷贝图形的模板第三章 matlab 提高 计算机仿真与模拟
MATLAB提供了两种 Windows应用程序的拷贝模板 ——
Word和 PowerPoint,用户可以在如图 6-49所示的对话框中设置相应的模板选项,而更加精细的设置需要在拷贝选项对话框中进行 。
在如图 6-50所示的对话框中可以设置精细的拷贝选项,比如剪贴板的选项以及背景图的设置等。当拷贝图形效果不甚理想的时候,可以通过修改这些设置来达到满意的效果。
第三章 matlab 提高 计算机仿真与模拟图 6-50 拷贝选项对话框第三章 matlab 提高 计算机仿真与模拟
6.7 数据插值和曲线拟合
6.7.1 插值运算一般地,从各种试验得来的数据总是有一定的数量,而利用插值技术能够从有限的数据中获取系统整体的状态,因此,
数据插值在各行各业,特别是信号处理领域内有着广泛的应用。
MATLAB软件作为数据处理的优秀软件之一,自然提供了常用的各种数据插值计算的函数。在本小节,主要介绍由 MATLAB
基本模块提供的插值计算函数。
第三章 matlab 提高 计算机仿真与模拟表 6-4 插值计算函数函数 说明
in te rp 1 一维插值 ( 数值查表 )
in te rp 1q 一维快速插值 ( 数值查表 )
in te rp 2 二维插值 ( 数值查表 )
in te rp 3 三维插值 ( 数值查表 )
in te r p n N 维插值 ( 数值查表 )
in te rp ft 使用 FFT 算法的一维插值
gr id da ta 二维数据网格的表面数据插值
gr id da ta 3 三维数据网格的超表面 (h yp e rsu rfa c e ) 数据插值
gr id da ta n 多维数据网格的超表面数据插值
m kp p 产生分段多项式
pc hi p 分段的厄密多项式
ppv al 计算分段多项式的数值
sp lin e 三次杨条插值
un m kp p 分段多项式的细节第三章 matlab 提高 计算机仿真与模拟在表 6-4的函数中较常用的就是进行基本插值的 interp系列函数,其中 interp1和 interp1q函数比较起来,后者在处理 X为单调递增的向量,Y为列向量或者行数同 X向量长度的矩阵进行插值计算的时候,速度较快,而且仅能进行线性插值 。
interp1函数一般的用法为
yi = interp1(x,y,xi,method)
其中:
* x和 y为原始数据 。
* xi为需要计算的插值点。
第三章 matlab 提高 计算机仿真与模拟
* method可以为插值计算指定相应的算法,为字符串类型,
其取值可以为 nearest,linear,spline,cubic,pchip,v5cubic。
在 interp系列函数中 method参数使用的几种不同的取值分别对应了不同的插值计算方法,例如 linear为线性插值算法,
它也是系统默认的插值算法,而 spline为三次杨条插值算法 。
有关插值算法请参阅相应的数值分析教科书,对于更高次的插值算法函数,请参阅 MATLAB的帮助文档 。
第三章 matlab 提高 计算机仿真与模拟若进行插值运算时,xi的取值超过了 x的范围,则需要进行外插运算,这个时候需要在使用函数的时候指定参数 extrap,
即函数的使用方法为
yi = interp1(x,y,xi,method,'extrap');
第三章 matlab 提高 计算机仿真与模拟例子 6-19 一维插值函数示例。
例子 6-19使用的脚本文件如下:
001 %INTERP_EX1 一维插值计算示例
002 % 准备数据
003 x = 0:10;
004 y = cos(x);
005 % 插值点
006 xi = 0:0.2:10;
007 % 进行插值运算
008 yin = interp1(x,y,xi,'nearest');
009 yic = interp1(x,y,xi,'cubic');
010 % 绘制结果
011plot(x,y,'o',xi,yin,'*',xi,yic)
012 legend('origin','nearest','cubic')
013 title('一维插值计算示例 ')
第三章 matlab 提高 计算机仿真与模拟运行脚本文件得到的结果如图 6-51所示 。 在例子 6-19的代码中,使用了两种一维插值算法,分别为 nearest和 cubic,由于 nearest算法仅计算插值点左近的数值,所以从结果上看插值得到的结果很不理想,而三次插值计算得到的结果相对要理想得多 。
不过从计算时间和内存等系统资源的损耗上考虑,nearest
是最快的而又最节省资源的一种算法,而三次插值或者样条插值运算则需要消耗较多的系统资源,所以请用户根据需要选择合适的插值算法。
第三章 matlab 提高 计算机仿真与模拟二维插值运算函数的使用方法类似一维插值运算函数的使用方法,同样也可以在使用函数的同时指定相应的算法:
nearest,linear,cubic和 spline等。与一维插值不同的是,这里使用的插值算法都需要进行双次运算,所以也可以在算法选择时使用 bilinear或者 bicubic关键字指定相应的算法。在例子 6-
20中,对这几种插值算法进行了比较。
第三章 matlab 提高 计算机仿真与模拟图 6-51 一维插值计算示例
0 1 2 3 4 5 6 7 8 9 10
一维插值
o r i g i n
n e a r e s t
c u b i c
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
第三章 matlab 提高 计算机仿真与模拟例子 6-20 二维插值运算算法比较。
001 function compare_interp( )
002 %COMPARE_INTERP 不同插值运算的比较
003
004 % 原始数据
005 [x,y] = meshgrid(?3:1:3);
006 z = peaks(x,y);
007 figure(1); clf
008 surfc(x,y,z);
009 title('原始数据 ')
010 % 进行插值运算第三章 matlab 提高 计算机仿真与模拟
011 [xi,yi] = meshgrid(?3:0.25:3);
012 zi1 = interp2(x,y,z,xi,yi,'nearest');
013 zi2 = interp2(x,y,z,xi,yi,'linear');
014 zi3 = interp2(x,y,z,xi,yi,'cubic');
015 zi4 = interp2(x,y,z,xi,yi,'spline');
016 % 通过可视化结果比较
017 figure(2)
018 subplot(2,2,1);surf(xi,yi,zi1);
019 title('二维插值 - ''nearest''')
020 subplot(2,2,2);surf(xi,yi,zi2);
021 title('二维插值 - ''linear''')
022 subplot(2,2,3);surf(xi,yi,zi3)
第三章 matlab 提高 计算机仿真与模拟
023 title('二维插值 - ''cubic''')
024 subplot(2,2,4);surf(xi,yi,zi4)
025 title('二维插值 - ''spline''')
026 % 可视化结果
027 figure(3)
028 subplot(2,2,1);contour(xi,yi,zi1)
029 title('二维插值 - ''nearest''')
030 subplot(2,2,2);contour(xi,yi,zi2)
031 title('二维插值 - ''linear''')
032 subplot(2,2,3);contour(xi,yi,zi3)
033 title('二维插值 - ''cubic''')
034 subplot(2,2,4);contour(xi,yi,zi4)
035 title('二维插值 - ''spline'''')
第三章 matlab 提高 计算机仿真与模拟图 6-52 例 6-20的结果图
(a) 原始数据的曲面图
-4
-2
0
2
4
-4
-2
0
2
4
-6
-4
-2
0
2
4
6
原始数据第三章 matlab 提高 计算机仿真与模拟图 6-52 例 6-20的结果图
(b) 插值数据结果图 —— surf
-5
0
5
-5
0
5
- 1 0
0
10
二维插值 - 'n e a r e s t '
-5
0
5
-5
0
5
- 1 0
0
10
二维插值 - 'l i n e a r '
-5
0
5
-5
0
5
- 1 0
0
10
二维插值 - 'c u b i c '
-5
0
5
-5
0
5
- 1 0
0
10
二维插值 - 's p l i n e '
第三章 matlab 提高 计算机仿真与模拟图 6-52 例 6-20的结果图
(c) 插值运算结果图 —— contour
-2 0 2
-3
-2
-1
0
1
2
3
二维插值 - 'n e a r e s t '
-2 0 2
-3
-2
-1
0
1
2
3
二维插值 - 'l i n e a r '
-2 0 2
-3
-2
-1
0
1
2
3
二维插值 - 'c u b i c '
-2 0 2
-3
-2
-1
0
1
2
3
二维插值 - 's p l i n e '
第三章 matlab 提高 计算机仿真与模拟若在执行例子 6-20的代码时,打开性能分析器,则可以看到 012~ 014行代码占用的计算时间,下面为分析文件的片段:
......
0.060 1 x 12 zi1 = interp2(x,y,z,xi,yi,'nearest');
0.030 1 x 13 zi2 = interp2(x,y,z,xi,yi,'linear');
0.051 1 x 14 zi3 = interp2(x,y,z,xi,yi,'cubic');
0.100 1 x 15 zi4 = interp2(x,y,z,xi,yi,'spline');
.....,
第三章 matlab 提高 计算机仿真与模拟通过例子 6-20的运算结果可以看出,不同的插值算法在运算结果和运算消耗时间上的差别 。 用户同样需要根据自己的需要选择不同的算法 。
有关数据插值的应用还有很多内容,受篇幅的限制这里就不再一一详细介绍。有兴趣的读者可以通过学习有关数值分析的知识,同时了解和掌握不同的 MATLAB数据插值函数。
第三章 matlab 提高 计算机仿真与模拟
6.7.2 曲线拟合曲线拟合的任务和数据插值的任务不同,曲线拟合需要从一些离散的数据中推导出两者之间的数学解析关系,而数据插值是通过原始数据计算一些新的离散数据点 。 曲线拟合的结果一般为一个或者多个数学解析关系,利用这些解析关系能够对数据进行一定的推断,准确的曲线拟合结果可以用来进一步评估,验证实测的数据 。 在本小节将介绍利用 MATLAB的基本模块进行曲线拟合的函数和方法,而 MATLAB高级的曲线拟合应用请参阅 MATLAB 和 Curve Fitting工具箱的帮助文档 。
利用 MATLAB进行曲线拟合主要有两种方法:回归法拟合和多项式拟合,本小节通过一些具体的示例来说明这两种不同的曲线拟合方法。
第三章 matlab 提高 计算机仿真与模拟例子 6-21 回归法曲线拟合 。
回归法主要使用 MATLAB的左除运算来寻找曲线拟合解析函数的系数 。 例如有这样一组数据:
>> t = [0,3,8 1.1 1.6 2.3]';
>> y = [0.5 0.82 1.14 1.25 1.35 1.40]';
将这组数据绘制出来:
>> plot(t,y,'r*')
>> grid on
得到如图 6-53所示的图形结果。
第三章 matlab 提高 计算机仿真与模拟图 6-53 进行拟合计算的原始数据
0 0,5 1 1,5 2 2,5
0,5
0,6
0,7
0,8
0,9
1
1,1
1,2
1,3
1,4
第三章 matlab 提高 计算机仿真与模拟通过图 6-53的分布情况,可以猜测该数据由如下的表达式得出:
进行曲线拟合的任务就是分别求得表达式中的三个系数,
这样就可以得到相应的等式关系:
Y=AT
若需要求得 A则只要计算除法:
A=Y/T
2210 tataay
第三章 matlab 提高 计算机仿真与模拟于是,在 MATLAB中键入下面的指令,就可以得到计算的结果:
>> X = [ones(size(t)) t t.^2]
X =
1.0000 0 0
1.0000 0.3000 0.0900
1.0000 0.8000 0.6400
1.0000 1.1000 1.2100
1.0000 1.6000 2.5600
1.0000 2.3000 5.2900
>> A = X\y
A =
0.5318
0.9191
-0.2387
第三章 matlab 提高 计算机仿真与模拟这样得到的多项式应该为
y=0.5318+0.9191t-0.2387t2
为了验证结果,可以进一步进行计算:
>> T = (0:0.1:2.5)';
>> Y = [ones(size(T)) T T.^2]*A;
>> plot(T,Y,'-',t,y,'o'),grid on
>> legend('Fitting','Origin')
这时得到的图形结果如图 6-54所示。
第三章 matlab 提高 计算机仿真与模拟图 6-54 拟合结果与原始数据的比较
0 0,5 1 1,5 2 2,5
0,5
0,6
0,7
0,8
0,9
1
1,1
1,2
1,3
1,4
1,5
F i t t i n g
O r i g i n
第三章 matlab 提高 计算机仿真与模拟除了多项式以外,还可以猜测原始数据的多项式是由指数函数组成的:
tt teaeaay 210
于是,为了求得系数,可以在 MATLAB的命令行中键入下面的指令:
>> X = [ones(size(t)) exp(-t) t.*exp(-t)]
X =
1.0000 1.0000 0
1.0000 0.7408 0.2222
1.0000 0.4493 0.3595
1.0000 0.3329 0.3662
第三章 matlab 提高 计算机仿真与模拟
1.0000 0.2019 0.3230
1.0000 0.1003 0.2306
左除:
>> A = X\y
A =
1.3974
-0.8988
0.4097
这样得到的多项式应该为
tt teey 4 0 9 7.08 9 8 8.03 9 7 4.1
第三章 matlab 提高 计算机仿真与模拟为了验证这次得到的结果,可以进一步计算:
>> T = (0:0.1:2.5)';
>> Y = [ones(size(T)) exp(-T) T.*exp(-T)]*A;
>> plot(T,Y,'-',t,y,'o'),grid on
>> legend('Fitting','Origin')
这时得到的曲线图形如图 6-55所示。
第三章 matlab 提高 计算机仿真与模拟图 6-55 曲线拟合结果和原始数据比较
0 0,5 1 1,5 2 2,5
0,4
0,6
0,8
1
1,2
1,4
1,6
F i t t i n g
O r i g i n
第三章 matlab 提高 计算机仿真与模拟可以看出,在两次的曲线拟合结果中,利用指数函数拟合的结果比较好 。
另外一种曲线拟合的方法是多项式拟合 。 在 MATLAB中,
进行多项式拟合主要使用两个函数,polyfit和 polyval。
polyfit函数主要用来进行拟合计算,它的基本语法为
p = polyfit(x,y,n)
其中,x和 y为参与曲线拟合计算的原始数据,n为进行拟合计算的多项式次数,函数的返回值是多项式的系数,也就是说,
函数的运算结果为多项式的系数向量。
第三章 matlab 提高 计算机仿真与模拟
0111,,,pxpxpxpy nnnn
polyval函数主要用来计算多项式的数值,它的基本语法为
y = polyval(p,x)
其中,p为多项式的系数,而 x是变量的数值,得到的结果就是函数的数值向量 。
第三章 matlab 提高 计算机仿真与模拟例子 6-22 polyfit函数和 polyval函数的应用示例。
下面是例子 6-22的脚本文件:
001 %CURVE_FIT 多项式拟合计算示例
002 % 准备原始数据
003 x = 0:.1:10;
004 y = sin(x)+cos(2*x);
005 % 5次多项式拟合
006 k5 = polyfit(x,y,5);
007 y5 = polyval(k5,x);
008 % 11次多项式拟合
009 k11 = polyfit(x,y,11);
010 y11 = polyval(k11,x);
第三章 matlab 提高 计算机仿真与模拟
011 % 绘制数据曲线
012 plot(x,y,'g',x,y5,'r',x,y11,'b')
013 % 标注
014 title('Curve Fitting','Fontsize',14)
015 legend('Original Curve','5th order','11th order',4 )
016 set(findobj('Type','line'),'LineWidth',2)
第三章 matlab 提高 计算机仿真与模拟运行例子 6-22的代码:
>> curve_fit
Warning,Polynomial is badly conditioned,Remove repeated data
points
or try centering and scaling as described in HELP POLYFIT.
(Type "warning off MATLAB:polyfit:RepeatedPointsOrRescale" to
suppress this warning.)
> In E:\MATLAB6p5\toolbox\matlab\polyfun\polyfit.m at line 75
In D:\Temp\Ch6\curve_fit.m at line 9
第三章 matlab 提高 计算机仿真与模拟出现上述警告信息的原因是使用了过高的数据拟合阶数 。
由于 polyfit函数是通过左除算法获取多项式系数的,如果此时矩阵接近奇异 (不可逆 ),但又需要对该矩阵进行求逆计算时,
则会出现上述的警告信息 。
例子 6-22运行的图形结果如图 6-56所示。
第三章 matlab 提高 计算机仿真与模拟图 6-56 曲线拟合的图形结果
0 1 2 3 4 5 6 7 8 9 10
Cu r v e Fi t t i n g
O r i g i n al C u r v e
5 t h o r d e r
1 1 t h o r d e r
-2
- 1,5
-1
- 0,5
0
0,5
1
1,5
第三章 matlab 提高 计算机仿真与模拟
6.7.3 基本拟合工具为了便于进行曲线拟合计算,MATLAB提供了基本的曲线拟合工具界面,利用这个图形界面,可以方便地实现常用的曲线拟合工作,利用该界面可以完成下列工作:
* 使用三次样条曲线 (cubic spline)或最高 10阶的多项式拟合数据 。
* 对一组给定的数据同时绘制多条拟合曲线 。
* 绘制拟合残差曲线 。
* 查看拟合的数值结果 。
* 对拟合曲线求值 (内插或外推 )。
* 用拟合数值结果和残差的范数标注图形 。
* 把拟合的结果保存到 MATLAB工作区。
第三章 matlab 提高 计算机仿真与模拟例子 6-23 使用基本曲线拟合工具 。
进行曲线拟合工作的第一步是加载原始数据,在本例子中,
使用的数据来自于 MATLAB自带的 Demo,关于该 MATLAB自带例子的信息请参阅在线帮助,help census。
在 MATLAB命令行窗口中键入下面的指令:
>> load census
>> plot(cdate,pop,'ro');
绘制出原始数据后,执行图形窗体,Tools”菜单下的
,Basic Fitting”命令,这时将弹出基本曲线拟合工具的图形用户界面,如图 6-57所示。
第三章 matlab 提高 计算机仿真与模拟在弹出的对话框中,首先选择需要进行曲线拟合的数据,
在,Select data”的下拉列表框中,选择,data1”,即当前进行曲线拟合运算的数据。若坐标轴上有多条数据时,则可以选择不同的曲线拟合原始数据。
第三章 matlab 提高 计算机仿真与模拟图 6-57 基本曲线拟合工具界面第三章 matlab 提高 计算机仿真与模拟然后选择一个合适的拟合算法。在基本曲线拟合算法列表框中,选择,cubic”复选框,这时将使用三次多项式进行曲线拟合计算。选择,Show equations”复选框,则系统将曲线拟合的多项式绘制在图形中。另外,还可以通过选择不同的复选框,
在图形窗体中输出曲线拟合的残差,以及残差的范数等,这时的曲线拟合工具界面如图 6-58所示。
第三章 matlab 提高 计算机仿真与模拟图 6-58 设置曲线拟合的属性第三章 matlab 提高 计算机仿真与模拟在选择曲线拟合算法的时候,系统有时候会给出如图 6-59
所示的对话框提示 。
该信息在前面利用函数进行多项式计算的时候已经有所提示,为了解决该问题,需要选择,Center and Scale X data”
复选框。在选择不同的曲线拟合属性的同时,系统将不断地将曲线拟合结果输出在图形窗体中,在完成了上述操作步骤之后,曲线图形窗体的结果如图 6-60所示。
第三章 matlab 提高 计算机仿真与模拟图 6-59 基本拟合计算的提示信息第三章 matlab 提高 计算机仿真与模拟图 6-60 曲线拟合的结果绘制在图形窗体中
1 8 0 0 1 8 2 0 1 8 4 0 1 8 6 0 1 8 8 0 1 9 0 0 1 9 2 0 1 9 4 0 1 9 6 0 1 9 8 0
r es i d u al s
C u b i c,n o r m o f r es i d u al s = 1 2,2 3 8
1 7 5 0 1 8 0 0 1 8 5 0 1 9 0 0 1 9 5 0 2 0 0 0
y = 0,9 2 * x
3
+ 2 5 * x
2
+ 7 4 * x + 6 2
d at a 1
cu b i c
0
1 0 0
2 0 0
3 0 0
-5
0
5
第三章 matlab 提高 计算机仿真与模拟此时图形窗体中的注释是由系统自动添加的,可以使用图形编辑器修改其中的内容 。 单击基本曲线拟合工具的按钮,
可以得到基本曲线拟合工具的扩展,在这部分扩展的工具界面中,可以查看曲线拟合计算的结果,包括多项式的系数和范数等,如图 6-61所示 。
第三章 matlab 提高 计算机仿真与模拟图 6-61 基本曲线拟合工具的界面扩展第三章 matlab 提高 计算机仿真与模拟在扩展界面中,单击,Save to workspace”按钮可以将曲线拟合计算得到的结果保存到工作空间中,如图 6-62所示。
图 6-62 将曲线拟合的结果保存到工作空间第三章 matlab 提高 计算机仿真与模拟这时保存的结果为一个结构,按下,OK”按钮之后在
MATLAB命令行窗口中输入下列指令进行查看:
Basic Fitting GUI created variables in the current workspace.
>> whos
Name Size Bytes Class
cdate 21x1 168 double array
fit1 1x1 318 struct array
normresid1 1x1 8 double array
pop 21x1 168 double array
Grand total is 68 elements using 662 bytes
第三章 matlab 提高 计算机仿真与模拟
>> fit1
fit1 =
type,'polynomial degree 3'
coeff,[0.9210 25.1834 73.8598 61.7444]
在工作空间中的变量包含了曲线拟合的多项式系数结果 。
利用该结果可以通过 polyval函数进一步计算多项式的数值 。
若再次单击基本曲线拟合界面上的按钮,则能够得到再次扩展的工具界面,在该界面中可以计算一下当前拟合多项式的数值,如图 6-63所示。
第三章 matlab 提高 计算机仿真与模拟图 6-63 进一步扩展基本曲线拟合界面第三章 matlab 提高 计算机仿真与模拟在本例子中,进一步计算了 2000年至 2040年之间的人口数量的变化,间隔为 10年。通过选择,Plot evaluated results”复选框,可以将这些拟合计算的结果也绘制在图形界面中,如图 6-
64所示。
第三章 matlab 提高 计算机仿真与模拟图 6-64 曲线拟合运算的结果
1750 1800 1850 1900 1950 2000 2050
y = 0,9 2 * x
3
+ 2 5 * x
2
+ 7 4 * x + 6 2
d a t a 1
c u b i c
Y = f ( X )
0
50
100
150
200
250
300
350
400
450
第三章 matlab 提高 计算机仿真与模拟如果选择,Save to workspace”按钮,还可以将结果保存在工作空间中 。
通过例子 6-23的学习,读者应该已经基本掌握了基本曲线拟合工具的使用方法。更高级的曲线拟合工作可以使用
MATLAB的曲线拟合工具箱来完成。不过有关曲线拟合工具箱方面的知识已经超出了本书的讨论范围,有兴趣的读者请参阅 MATLAB的帮助文档。
第三章 matlab 提高 计算机仿真与模拟6.8 本 章 小 节在本章详细介绍了 MATLAB的基本图形和数据可视化的能力。 MATLAB的图形和数据可视化是其强大功能的一个重要表现,这其中包括了灵活的二维和三维数据可视化、各种图形标注和特殊图形的绘制能力,另外 MATLAB还提供了丰富的导入、
导出数据图形的能力。 MATLAB不仅能够将图形绘制出来,而且还具有完成一定的数据分析的能力,在本章介绍了数据插值和曲线拟合的方法。通过本章的学习,读者应该能够掌握基本的数据可视化和绘图函数的使用,同时能够完成简要的数据统计分析的工作。除了利用 MATLAB本身的数据分析功能以外,
还可以利用 Curve Fitting 工具箱完成复杂的曲线拟合工作,使用
Statistics工具箱进行高级数据统计工作。数据可视化和分析是科学计算、信号处理、控制系统应用等领域的重要内容,掌握本章的内容可以为这些领域内的高级应用打下坚实的基础。
3.1 matlab编程基础
3.2 图形基础第三章 matlab 提高 计算机仿真与模拟
3.1 MATLAB编程基础
1 概述
2 流程控制
3 脚本文件
4 函数文件
5 M文件调试
6 M文件性能分析第三章 matlab 提高 计算机仿真与模拟
1 概 述
MATLAB提供了完整的编写应用程序的能力,这种能力通过一种被称为 M语言的高级语言来实现。这种编程语言是一种解释性语言,利用该语言编写的代码仅能被 MATLAB接受,被
MATLAB解释、执行。其实,一个 M语言文件就是由若干
MATLAB的命令组合在一起构成的,这些命令都是在前面章节中介绍的合法的 MATLAB命令。和 C语言类似,M语言文件都是标准的纯文本格式的文件,其文件的扩展名为,m。
第三章 matlab 提高 计算机仿真与模拟使用 M文件最直接的好处就是可以将一组 MATLAB命令组合起来,通过一个简单的指令就可以执行这些命令 。 这些命令可以完成某些 MATLAB的操作,也可以实现某个具体的算法 。
其实,MATLAB产品族中包含的工具箱就是由世界上在相应专业领域内的顶尖高手,利用 M语言开发的算法函数文件集合 。
MATLAB的函数主要有两类,一类被称为内建 (Build-in)函数,这类函数是由 MATLAB的内核提供的,能够完成基本的运算,例如三角函数,矩阵运算的函数等 。 另外一类函数就是利用高级语言开发的函数文件,这里的函数文件既包括用 C语言开发的 MEX函数文件,又包含了 M函数文件 。
第三章 matlab 提高 计算机仿真与模拟如前所述,MATLAB的 M语言文件是纯文本格式的文件,
利用任何一种纯文本编辑器都可以编写相应的文件,例如
Windows平台下的记事本,UltraEdit等软件,或者 Unix平台下的 Emacs软件等 。 同样,为了方便编辑 M文件,MATLAB也提供了一个编辑器,叫作 meditor,它也是系统默认的 M文件编辑器 。
运行 meditor的方法非常简单,在 MATLAB命令行窗口中键入下面的指令就可以打开 meditor:
>> edit
这时 MATLAB将启动 meditor,然后创建一个未命名的空白文件,如图 1所示。
第三章 matlab 提高 计算机仿真与模拟图 1 meditor的运行界面第三章 matlab 提高 计算机仿真与模拟这时用户就可以直接在编辑器中键入 MATLAB指令,开发 M语言文件了 。
此外,运行 meditor还可以通过,File”菜单中,New”子菜单下的,M-File”命令来实现,或者直接单击 MATLAB用户界面工具栏上的新建按钮完成同样的工作 。
M语言文件可以分为两类,其中一类是脚本文件,另外一类叫作函数文件。下面将分别介绍这两类文件的编写方法。
第三章 matlab 提高 计算机仿真与模拟
2 流 程 控 制
2.1 选择结构如前所述,当人们判断某一条件是否满足,根据判断的结果来选择不同的解决问题的方法时,就需要使用选择结构。和
C语言类似,MATLAB的条件判断可以使用 if语句或者 switch 语句。
第三章 matlab 提高 计算机仿真与模拟
2.1.1 if语句
if语句的基本语法结构有三种,分别如下:
(1) if 关系运算表达式
MATLAB语句
end
这种形式的选择结构表示,当关系运算表达式计算的结果为逻辑真的时候,执行 MATLAB语句,这里的 MATLAB语句可以是一个 MATLAB表达式,也可以是多个 MATLAB表达式。在
MATLAB语句的结尾处,必须有关键字 end。
第三章 matlab 提高 计算机仿真与模拟
(2) if 关系运算表达式
MATLAB语句 A
else
MATLAB语句 B
end
这种选择结构表示,当关系运算表达式的计算结果为逻辑真的时候,执行 MATLAB语句 A,否则执行 MATLAB语句 B,
在语句 B的结尾必须具有关键字 end。
第三章 matlab 提高 计算机仿真与模拟
(3) if 关系运算表达式 a
MATLAB语句 A
elseif 关系运算表达式 b
MATLAB语句 B
else 关系运算表达式 c
end
这种选择结构可以判断多条关系运算表达式的计算结果,
然后按照执行的逻辑关系执行相应的语句。
…
第三章 matlab 提高 计算机仿真与模拟例子 1 if语句的使用 ——if_examp.m。
通过本例子将同时了解 meditor的基本使用方法 。 打开 meditor,
然后键入下面的指令:
001 clear all
002
003 I=1;
004 J=2;
005
006 if I == J
007 A(I,J) = 2;
008 elseif abs(I-J) == 1
009 A(I,J) = -1;
010 else
011 A(I,J) = 0;
012 end
第三章 matlab 提高 计算机仿真与模拟注意:
在键入程序时,不要将行号 (001~ 012)也敲进去,在这里设置行号的主要目的是为了便于讲解和分析程序 。
所有的指令键入完毕后,将文件保存,可以将其保存为任何名字,不过文件名必须由英文字符和数字组成,将文件的扩展名设置为,m,并且将文件保存在 MATLAB的搜索路径下,例如 MATLAB当前的工作路径 。
然后在 MATLAB的命令行中,键入刚才保存的文件名,不过,这时不要将扩展名也一同键入,MATLAB就会依次执行这些指令。
第三章 matlab 提高 计算机仿真与模拟运行例子 1的方法和效果如下:
>> if_examp
A =
0 -1
例子 1代码的核心是 006~ 012行的部分,这部分展示了 if-
elseif-else-end语句组合的使用方法 。 请仔细察看,并且通过修改程序 003和 004行中对 I和 J的赋值来察看整个语句的执行情况 。
和 C语言类似,if-elseif-else的语句结构也可以嵌套地使用,
也就是可以存在这样的语句结构:
第三章 matlab 提高 计算机仿真与模拟
if(关系表达式 a)
if(关系表达式 b) MATLAB语句 A
else MATLAB语句 B
end
else
if(关系表达式 c) MATLAB语句 C
else MATLAB语句 D
end
end
第三章 matlab 提高 计算机仿真与模拟注意:
在使用嵌套的选择结构时,需要小心 if语句和 end关键字的配对。
例子 2 嵌套使用的 if结构 ——if_examp2.m。
001 clear all
002
003 if 1
004 disp('Is 1')
005 else
006 disp('Not 1')
007 end
008
第三章 matlab 提高 计算机仿真与模拟
009 I = 1;
010 if I
011 if I < 2
012 disp('I is bigger than 0 but less than 2')
013 end
014 else
015 if I > -2
016 dis('I is less than 0 but bigger than -2')
017 end
018 end
第三章 matlab 提高 计算机仿真与模拟该程序的运行方法和效果如下:
>> if_examp2
Is 1
I is bigger than 0 but less than 2
在例子 2中,主要说明了嵌套的 if结构和在关系表达式中使用常量的方法。在代码的 003行,if语句的关系表达式为常数 1,
这个时候 if语句将始终认为非零值为逻辑真,所以,程序执行了 004行的代码。同样,在程序的 009行,if语句的关系表达式为变量 I,若 I的数值为非零值,则 if语句判断其为逻辑真,所以,
代码的 016行只有在 I为 0时,才可能被执行。
第三章 matlab 提高 计算机仿真与模拟
2.1.2 switch语句另外一种构成选择结构的关键字就是 switch。 在处理实际问题的时候,往往要处理多个分支,这时如果使用 if-else语句处理多分支结构往往使程序变得十分冗长,从而降低了程序的可读性 。 switch语句就可以用于处理这种多分支的选择,它的基本语法结构如下:
第三章 matlab 提高 计算机仿真与模拟
switch(表达式 )
case 常量表达式 a,MATLAB语句 A
case 常量表达式 b,MATLAB语句 B
case 常量表达式 m,MATLAB语句 M
otherwise,MATLAB语句 N
end
…
第三章 matlab 提高 计算机仿真与模拟在 switch语句之后的表达式可以是一个数值类型表达式或者是一个数值类型的变量,当这个表达式的值同 case后面的某一个常量表达式相等时,则执行该 case后面的常量表达式后面的语句 。
注意:
MATLAB的 switch和 C语言的 switch语句结构不同。在 C语言中,每一个 case后面的语句中必须包含类似 break语句的流程控制语句,否则程序会依次执行符合条件的 case语句后面的每一个 case分支。但是在 MATLAB中就不必如此,程序仅仅执行符合条件的 case分支。
第三章 matlab 提高 计算机仿真与模拟例子 3 switch结构使用示例 ——switch_examp.m。
001 clear all
002
003 algorithm =
input(‘Enter an algorithm in quotes (ode23,ode15s,etc:) ’,’s’);
004
005 switch algorithm
006 case 'ode23'
007 str = '2nd/3rd order';
008 case {'ode15s','ode23s'}
009 str = 'stiff system';
010 otherwise
011 str = 'other algorithm';
012 end
013 disp(str);
第三章 matlab 提高 计算机仿真与模拟该文件的运行方法和效果如下:
>> switch_examp
Enter an algorithm in quotes (ode23,ode15s,etc:) 'ode23'
2nd/3rd order
>> switch_examp
Enter an algorithm in quotes (ode23,ode15s,etc:) 'ode4'
other algorithm
第三章 matlab 提高 计算机仿真与模拟例子 3中需要用户在执行程序的过程中输入一个字符串,
switch语句根据用户的输入判断执行相应的 case分支 。 若没有符合条件的 case分支,则 switch执行 otherwise后面的语句 。 若
switch结构中没有定义 otherwise及其相应的代码,则程序不会进行任何操作,而是直接退出 switch结构 。
提示:
在处理以字符串变量或者常量参与的关系判断操作时,使用 switch结构要比 if-else结构效率高一些 。
由于 MATLAB的 switch结构没有 C语言的 fall-through特性,
所以,如果需要针对多个条件而使用同一个 case分支的时候,
需要使用元胞数组与之配合,参见例子 4。
第三章 matlab 提高 计算机仿真与模拟例子 4 switch结构使用示例 ——switch_examp2.m。
001 clear all
002
003 var = input('Input a Numer:');
004 switch var
005 case 1
006 disp('1')
007 case {2,3,4}
008 disp('2 or 3 or 4')
009 case 5
010 disp('5')
011 otherwise
012 disp('something else')
013 end
第三章 matlab 提高 计算机仿真与模拟例子 4运行的方法和效果如下:
>> switch_examp2
Input a Numer:1
1
>> switch_examp2
Input a Numer:3
2 or 3 or 4
>> switch_examp2
Input a Numer:7
something else
第三章 matlab 提高 计算机仿真与模拟例子 4代码的核心部分为 007行,这里使用元胞数组增加判断条件的个数,当输入的数字为 2,3或者 4时,switch结构将使用同一个 case分支进行判断,计算 。
注意:
从代码的完整性和可靠性角度出发,在使用 switch语句时,
一定要包含 otherwise分支,这是一种良好的编程习惯。
第三章 matlab 提高 计算机仿真与模拟
2.2 循环结构在解决很多问题的时候需要使用循环结构,例如求解数列的和或者进行某种迭代法求解数值方程时,都需要循环结构配合完成计算 。
在 MATLAB中,包含两种循环结构,一种是循环次数不确定的 while循环,而另一种是循环次数确定的 for循环。
第三章 matlab 提高 计算机仿真与模拟
1,while循环结构
while语句可以用来实现,当,型的循环结构,它的一般形式如下:
while(表达式 )
MATLAB语句
end
当表达式为真时,循环将执行由语句构成的循环体,其特点是先判断循环条件,如果循环条件成立,即表达式运算结果为“真”,再执行循环体。循环体执行的语句可以是一句也可以是多句,在 MATLAB语句之后必须使用关键字 end作为整个循环结构的结束。另外,在循环过程中一定要能够改变关系表达式或者布尔类型变量的值,或者使用其他方法来跳出循环,否则会陷入死循环 (无法正常退出的循环叫作死循环 )。
第三章 matlab 提高 计算机仿真与模拟例子 5 使用 while语句求解 。
001 i = 1;
002 sum = 0;
003 while ( i <= 1000 )
004 sum = sum+i;
005 i = i+1;
006 end
007 str = ['计算结果为,',num2str(sum)];
008 disp(str)
1000
1n
n
第三章 matlab 提高 计算机仿真与模拟例子 5的运行结果为
>> while_example
计算结果为,500500
例子 5的 002~006行使用了 while循环结构,在循环结构中进行了累加的操作。需要注意的是,在 MATLAB中没有类似 C
语言的 ++或者 +=等运算操作符,因此在进行诸如累加或者递减的运算时,不得不给出完整的表达式。另外,例子 5求数列和的算法的运算效率很低,在 MATLAB中不要使用这样的结构完成类似的运算,而需要采用向量化的计算。
第三章 matlab 提高 计算机仿真与模拟注意:
while循环结构的关系表达式可以是某个数据变量或者常量,这时,将按照非零值为逻辑真进行相应的操作。另外,
在进行上述操作时,若数据变量为空矩阵,则 while语句将空矩阵作为逻辑假处理,也就是说,在 while A MATLAB语句 S1
end结构中,若 A为空矩阵,则 MATLAB语句 S1永远不会被执行。
第三章 matlab 提高 计算机仿真与模拟
2,for循环结构使用 for语句构成循环是最灵活,简便的方法,不过,使用 for语句循环需要预先知道循环体执行的次数,所以这种循环一般叫作确定循环 。 在 MATLAB中 for循环的基本结构如下:
for index = start:increment:end
MATLAB语句
end
其中,index的取值取决于 start和 end的值,一般地,这里通常使用等差的数列向量,参见例子 6。
第三章 matlab 提高 计算机仿真与模拟例子 6 使用 for语句求解 。
001 sum = 0;
002 for i = 1:1000
003 sum = sum+i;
004 end
005 str = ['计算结果为,',num2str(sum)];
006 disp(str)
1000
1n
n
第三章 matlab 提高 计算机仿真与模拟例子 6运行的结果为
>> for_example
计算结果为,500500
在例子 6中,002行的代码使用了确定次数的 for循环结构,
循环次数使用行向量进行控制,而且索引值 i按照默认的数值 1
进行递增 。
在 for循环语句中,不仅可以使用行向量进行循环迭代的处理,也可以使用矩阵作为循环次数的控制变量,这时循环的索引值将直接使用矩阵的每一列,循环的次数为矩阵的列数,参见例子 7。
第三章 matlab 提高 计算机仿真与模拟例子 7 for循环示例。
001 A = rand(3,4);
002
003 for i = A
004 sum = mean(i)
005 end
例子 7运行的结果为
>> for_matrices
sum =
0.2728
sum =
0.6649
sum =
0.4275
sum =
0.5220
第三章 matlab 提高 计算机仿真与模拟例子 7尽管只有短短的几行,但是在 003行使用了一个矩阵作为循环的索引值,于是,循环结果就分别计算矩阵的每一列元素的均值 。
和其他高级语言类似,MATLAB的循环结构也可以进行嵌套使用,使用嵌套的循环需要注意 for关键字和 end关键字之间的配对使用。
第三章 matlab 提高 计算机仿真与模拟
2.3 break语句和 continue语句在循环结构中还有两条语句会影响程序的流程,这就是
break语句和 continue语句,这两条语句的基本功能如下:
● 当 break语句使用在循环体中的时候,其作用是能够在执行循环体的时候强迫终止循环,即控制程序的流程,使其提前退出循环,它的使用方法是
break;
● continue语句出现在循环体中的时候,其作用是能够中断本次的循环体运行,将程序的流程跳转到判断循环条件的语句处,继续下一次的循环,它的使用方法是
continue;
第三章 matlab 提高 计算机仿真与模拟例子 8 break语句示例 ——break_example.m。
001 i = 0;
002 j = 0;
003 k = 0;
004 for i = 1:2
005 for j = 1:2
006 for k = 1:2
007 if(k == 2)
008 disp('退出循环 ');
009 break;
010 end
第三章 matlab 提高 计算机仿真与模拟
011 str = sprintf('I = %d,J = %d,K = %d',i,j,k);
012 disp(str);
013 end
014 end
015 end
016 disp('程序运行结束 ');
第三章 matlab 提高 计算机仿真与模拟例子 8 的运行结果如下:
>> break_example
I = 1,J = 1,K = 1
退出循环
I = 1,J = 2,K = 1
退出循环
I = 2,J = 1,K = 1
退出循环
I = 2,J = 2,K = 1
退出循环程序运行结束第三章 matlab 提高 计算机仿真与模拟
break语句的作用是退出当前的循环结构运行,所以在例子 8中,位于最内层循环的 break语句执行的结果是退出了最内层的循环 k,位于外层的循环 i和 j还是都运行完毕了 。
第三章 matlab 提高 计算机仿真与模拟例子 9 continue语句示例。
001 i = 0;
002 for i =1:6
003 if(i>3)
004 continue
005 else
006 str = sprintf('I = %d',i);
007 disp(str);
008 end
009 end
010 str = sprintf('循环结束 I = %d',i);
011disp(str);
第三章 matlab 提高 计算机仿真与模拟例子 9的运行结果如下:
>> continue_example
I = 1
I = 2
I = 3
循环结束 I = 6
continue语句的作用在例子 9中得到了充分说明,该语句终止当前的循环,然后继续下一次循环运算,直到所有的循环迭代运算结束为止。
第三章 matlab 提高 计算机仿真与模拟
2.4 提高运算性能
M语言和其他的高级语言不同,由于采用了解释型语言,
所以 M语言的执行效率肯定低于编译型语言 (例如 C语言 )。 然而,
随着 MATLAB版本的不断升级,再加之合理利用 MATLAB向量运算等特点可以较大幅度地提高 M语言代码的执行效率 。 在本小节结合一些具体的例子来讲述 M语言编程以及 MATLAB软件本身在提高程序执行效率方面的一些特性 。
第三章 matlab 提高 计算机仿真与模拟
1,向量化运算
MATLAB最初的目的是提供便利的矩阵数据操作能力。所以在大多数的应用程序中,不要使用循环结构操作矩阵的元素,
应直接使用矩阵元素的索引或者矩阵运算的函数,这样做不仅能够提高代码的执行效率,而且还能够提高程序的可读性,这就是所谓的向量化的运算,也就是说,尽量将使用 while循环或者 for循环的语句结构转换成等价的向量或者矩阵运算,以提高程序的运算速度,参见例子 10。
第三章 matlab 提高 计算机仿真与模拟例子 10 向量化运算 ——array_vs_loops.m。
001 Mass = rand(50,100000);
002 Length = rand(50,100000);
003 Width = rand(50,100000);
004 Height = rand(50,100000);
005
006 [rows,cols] = size(Mass);
007
008 disp([char(10),'使用数组运算,'])
009 tic
010 Density = Mass./(Length.*Width.*Height);
011toc
第三章 matlab 提高 计算机仿真与模拟
012
013 disp([char(10),'使用循环结构,'])
014 tic;
015 for I = 1:rows
016 for J = 1:cols
017 Density(I) = Mass(I,J)/(Length(I,J)*Width(I,J)*Height(I,J));
018 end
019 end
020 toc
第三章 matlab 提高 计算机仿真与模拟例子 10比较了循环结构和数组运算的执行效率,程序中分别在 010行使用数组运算和在 015~ 019行使用循环结构完成了同样的工作 。 程序的运行结果如下:
>> array_vs_loops
使用数组运算:
elapsed_time =
0.188000
使用循环结构:
elapsed_time =
0.796000
第三章 matlab 提高 计算机仿真与模拟
2,预分配存储空间另外一种能够提高运算效率的方法就是进行内存变量存储空间的预分配,首先察看例子 11。
例子 11 内存预分配的例子 —— pre_allocate.m。
001 disp([char(10),'使用内存预分配,'])
002 pre_allo = zeros(10000,1);
003 tic;
004 for I = 1:10000
005 pre_allo(I) = rand(1);
006 end
第三章 matlab 提高 计算机仿真与模拟
007 toc
008
009 disp([char(10),'不使用内存预分配,'])
010 tic;
011 for J = 1:10000
012 not_pre_allo(J) = rand(1);
013 end
014 toc
第三章 matlab 提高 计算机仿真与模拟例子 4-11的执行结果如下:
>> pre_allocate
使用内存预分配:
elapsed_time =
0.016000
不使用内存预分配,
elapsed_time =
0.141000
第三章 matlab 提高 计算机仿真与模拟上面两种不同的运算惟一的区别就是程序 002行,执行这行语句之后,MATLAB自动分配了 10 000个连续的内存空间用于存储数据,MATLAB将一次创建足够的存储空间,然后依次赋值 。 而后者 not_pre_alloc变量没有进行相应的操作,所以带来了两次运算结果的不同 。
在不使用内存预分配的运算中,MATLAB是如何进行操作的呢?
当 I=1时,MATLAB将使用一小块长度为一个单元大小的内存保存一位随机数 。
当 I=2时,MATLAB寻找一块两单元大小的内存区,一个单元放第一个随机数,第二个放另外一个随机数。
…
第三章 matlab 提高 计算机仿真与模拟当 I = 10000 时,MATLAB 寻找一块容纳 10000单元的内存区存放以前的 9999个随机数,同时把最新的一个随机数加入进去 。 代码运行的结果造成了存储空间的浪费,降低了程序的执行速度 。
所以,在编写 M语言程序的时候需要尽量使用内存的预分配,而少使用或者不使用数组内存空间的自动扩充方式。
MATLAB针对不同的数据类型有不同的内存预分配函数,见表
1。
第三章 matlab 提高 计算机仿真与模拟表 1 内存预分配函数数据类型 函 数 例 子数值数组 z e r o s Y = z e r o s( 1,1 0 0 0 0 )
元胞数组 c e ll
Y = c e ll ( 2,3 ) ;
Y { 1,3 } = z e r o s( 1,1 0 0 0 0 ) ;
Y { 2,3 } = 's tr in g '
结构数组 st r u c t,r e p m a t Y = r e p m a t( st r u c t( f ie ld,v a lu e ),2,3 )
第三章 matlab 提高 计算机仿真与模拟表 1中说明了不同数据类型所要使用的内存预分配函数,
其中结构类型的数组需要两个函数配合使用,利用 struct函数构造结构,而使用 repmat函数创建数组 。
对于非双精度类型的数据,例如整数类型或者单精度类型,
进行内存的预分配时,需要使用相应的构造函数或者类型转换函数,例如:
Y = int16(zeros(1:10000));
在上面的表达式中创建了连续的 10 000个 16位整数的存储空间 。
当预先分配的内存空间无法容纳数据时,则可以通过
repmat函数来扩充数组的存储空间 。
第三章 matlab 提高 计算机仿真与模拟
3,MATLAB加速器尽管利用了上述的特性可以明显提高 M语言的运行效率,
但是在同等条件下,M语言的效率还是无法和第四代高级编程语言的执行效率相媲美,于是,在 MATLAB 新版本中,新增加了 MATLAB性能加速器这样一个新特性。 MATLAB性能加速器能够明显改善循环结构、内建函数调用等方面的运行效率,特别是在处理循环迭代次数确定的 for循环结构中,其运算速度较早期的 MATLAB版本有很大的提高,在表 2中总结了 MATLAB
加速器能够发挥作用的 M语言元素。
第三章 matlab 提高 计算机仿真与模拟表 2 加速器能够影响的 M语言元素
M 语言元素 作 用 范 围 说 明数据类型
MA TLAB 性能加速器能够针对布尔类型 ( 逻辑数组 ),字符串类型,8 位、
16 位和 32 位整数类型 ( 包含有符号和无符号整数类型 ),双精度类型的数据运算进行性能加速数组构造
MA TLAB 性能加速器可以针对数组的构造 (s hap e) 进行加速,但是对于维数超过三的多维数组无能为力
for 循环结构对于具备下列特征的 for 循环结构能够进行性能加速,
循环迭代的索引是标量;
循环体是加速器支持的数据类型运算和 ( 或 ) 数组构造重组操作;
循环体内调用的函数都是 MA TL AB 的内 建函数选择结构对于关系表达式使用标量运算的选择结构,MA TL AB 性能加速器能够提高其执行的速度第三章 matlab 提高 计算机仿真与模拟表 3 性能加速器不起作用的 M语言元素
M 语言元素 说 明数据类型除了能够加速的数据类型以外,其他的数据类型例如单精度类型、元胞数组、结构数组,Jav a 类对象等数据参与的操作无法加速函数调用若在 M A T L AB 代码中调用了其他 M 或 MEX 函数,则性能加速器无法发挥作用多操作代码行若在一行代码中进行了多条语句操作,例如
x = a,na m e; for k= 1:10 000,sin(A (k)),en d; 这样的语句无法进行加速数据类型改变若在程序中对已经存在的变量修改了数据类型,则性能加速器不能发挥作用,例如
X = 23;
- ac ce ler ate d co de -,
X = 'A'; % 这行代码不能加速
- m ore a cc ele ra ted c ode -
复数常量若在运算中直接将 i 和 j 作为复数常量参与运算,例如 Y= 2+ 3 * i,则性能加速器不能发挥作用,正确的做法应该是写作 Y= 2 +3 i
第三章 matlab 提高 计算机仿真与模拟例子 12 性能加速器说明 ——jitaccel.m。
001 tic
002 A = rand(500000,1);
003 B = zeros(500000,1);
004 B(1) = A(1);
005 for i = 2:500000
006 B(i) = B(i-1) + A(i);
007 end
008 toc
第三章 matlab 提高 计算机仿真与模拟在 MATLAB 6.1中:
>> jitaccel
elapsed_time =
5.2780
在 MATLAB 6.5中:
>> jitaccel
elapsed_time =
0.0900
在 MATLAB 7.0中:
>> jitaccel
elapsed_time =
0.0310
第三章 matlab 提高 计算机仿真与模拟通过比较,可以看出 MATLAB性能加速器明显提高了程序的执行效率,在有些情况下,加速器使执行速度提高 10~ 100
倍 。
注意:
例子 12代码运算得到的时间和具体运行 MATLAB的计算机的性能有关,不同的计算机环境得到的计算结果不尽相同。
第三章 matlab 提高 计算机仿真与模拟
3 脚 本 文 件脚本文件是最简单的一种 M语言文件,在前面的例子中都使用了脚本文件。所谓脚本文件,就是由一系列的 MATLAB指令和命令组成的纯文本格式的 M文件,执行脚本文件时,文件中的指令或者命令按照出现在脚本文件中的顺序依次执行。脚本文件没有输入参数,也没有输出参数,执行起来就像早期的
DOS操作系统的批处理文件一样,而脚本文件处理的数据或者变量必须在 MATLAB的公共工作空间中。
第三章 matlab 提高 计算机仿真与模拟例子 13 脚本文件示例。
001 % 注释行
002 % M脚本文件示例
003 % "flower petal"
004 % 以下为代码行
005 % 计算
006 theta = -pi:0.01:pi;
007 rho(1,:) = 2*sin(5*theta).^2;
008 rho(2,:) = cos(10*theta).^3;
009 rho(3,:) = sin(theta).^2;
010 rho(4,:) = 5*cos(3.5*theta).^3;
第三章 matlab 提高 计算机仿真与模拟
011 for k = 1:4
012 % 图形输出
013 subplot(2,2,k)
014 plot(theta,rho(k,:))
015 end
016 disp('程序运行结束 !')
在 MATLAB命令行中运行该脚本文件:
>> script_example
程序运行结束 !
第三章 matlab 提高 计算机仿真与模拟图 2 例子 13脚本文件的运行结果第三章 matlab 提高 计算机仿真与模拟仔细察看例子 13的脚本文件,在脚本文件中,主要由注释行和代码行组成。 M文件的注释行需要使用 %定义符,在 %之后的所有文本都认为是注释文本,不过,M文件的注释定义符仅能影响一行代码,类似于 C++语言中的,//”。然而在 M语言中,没有类似 C语言的注释定义符,/*”和,*/”,所以无法一次定义多行注释。
第三章 matlab 提高 计算机仿真与模拟脚本文件中的代码行都是一些简单的 MATLAB指令或者命令,这些命令可以用来完成相应的计算处理数据、绘制图形结果的操作,也可以在脚本文件中调用其他的函数完成复杂的数学运算,在例子 13中就完成了这些工作。另外,在 MATLAB中还有一些指令用来处理程序和用户之间的交互,在表 4中进行了总结。
第三章 matlab 提高 计算机仿真与模拟表 4 脚本文件中常用的 MATLAB指令指 令 说 明
pause 暂停当前 M 文件的运行,按任意键继续
input 等待用户输入
keyboard
暂停当前 M 文件的运行,并将程序控制权交还给 MA TL AB 命令行,这时可以正常使用命令行,直到键入,re turn,并按回车键后,M 文件才继续运行
return 返回当前的函数或者命令行第三章 matlab 提高 计算机仿真与模拟
4 函 数 文 件
4.1 基本结构
M函数文件和脚本文件不同,函数文件不仅有自己特殊的文件格式,不同的函数还分别具有自己的工作空间。同其他高级语言类似,M函数文件也有局部变量和全局变量,参见例子
14。
第三章 matlab 提高 计算机仿真与模拟例子 14 函数文件示例 ——average.m。
001 function y = average(x)
002 % AVERAGE 求向量元素的均值
003 % 语法:
004 % Y = average(X)
005 % 其中,X 是向量,Y为计算得到向量元素的均值
006 % 若输入参数为非向量则出错
007
008 % 代码行
009 [m,n] = size(x);
010 % 判断输入参数是否为向量第三章 matlab 提高 计算机仿真与模拟
011 if (~((m == 1) | (n == 1)) | (m == 1 & n == 1))
012 % 若输入参数不是向量,则出错
013 error('Input must be a vector')
014 end
015 % 计算向量元素的均值
016 y = sum(x)/length(x);
第三章 matlab 提高 计算机仿真与模拟在 MATLAB命令行中,键入下面的指令运行例子 14的代码:
>> z = 1:99;
>> y = average(z)
y =
50
第三章 matlab 提高 计算机仿真与模拟
M语言函数文件具有下面的不同部分:
* 函数定义行。
* 在线帮助。
* 注释行。
* M语言代码。
第三章 matlab 提高 计算机仿真与模拟下面结合例子 14分别说明这些部分的构成。
函数定义行,例子 14的函数定义行为代码的 001行:
001 function y = average(x)
第三章 matlab 提高 计算机仿真与模拟这一行代码中包括关键字 function,函数输出参数 y,函数的名称 average和函数的输入参数 x。 需要注意的是函数的名称,
函数的名称定义要求必须以字符开头,后面可以用字符,数字和下划线的组合构成函数名称 。 MATLAB对函数名称的长度有限定,读者可以在自己的 MATLAB中,通过执行 namelengthmax
函数获取相应的数值 。 假设该函数返回的数值为 N,若函数的名称长度超过了 N,则 MATLAB使用函数名称的前 N个字符作为函数名称 。
一般推荐将函数名称用小写的英文字符表示,同时函数的
M文件名称最好和函数名称保持一致,若文件名称和函数名称不一致,则调用函数的时候需要使用文件名称而非函数名称。
第三章 matlab 提高 计算机仿真与模拟
M函数文件的在线帮助为紧随在函数定义行的注释行 。 在例子 4-14中,average函数的在线帮助为 002~ 006行的注释行 。
若在 MATLAB命令行中键入下面的指令:
>> help average
在 MATLAB的命令窗口中就会出现:
AVERAGE 求向量元素的均值语法:
Y = average(X)
其中,X是向量,Y为计算得到向量元素的均值若输入参数为非向量则出错第三章 matlab 提高 计算机仿真与模拟其中,在线帮助中比较重要而且特殊的是在线帮助的第一行,
在 MATLAB中将这行注释称为 H1帮助行,它是在线帮助的第一行,若使用 lookfor函数查询函数时,仅查询并显示函数的
H1帮助行,例如,在 MATLAB命令行中键入下面的指令:
>> lookfor average
在 MATLAB的命令窗口中就会出现:
AVERAGE 求向量元素的均值
MEAN Average or mean value,
…
第三章 matlab 提高 计算机仿真与模拟由于 H1帮助行的特殊作用,所以在用户自己定义 M函数文件时,一定要编写相应的 H1帮助行,对函数进行简明,扼要的说明或者解释 。
例子 14的 008,010,012,015行代码分别是程序具体的注释行,这些注释行不会显示在在线帮助中,主要原因就是这些注释行没有紧随在 H1帮助行的后面,其中 008行的注释与在线帮助之间有一个空行 。 其实从 008行开始一直到文件的结尾都是
M函数文件的代码行,这些代码行需要完成具体的算法,实现用户的具体功能 。 代码行就是用户开发的算法 M语言的实现 。
第三章 matlab 提高 计算机仿真与模拟
4.2 输入输出参数
M语言函数文件的输入,输出参数和其他高级语言的输入,
输出参数不同,在定义这些输入,输出参数的时候不需要指出变量的类型,因为 MATLAB默认这些参数都使用双精度类型,
这样可以简化程序的编写 。 而且在定义参数时,也没有确定输入参数的维数或者尺寸,也就是说,直接从参数上无法判断输入来的是标量,向量还是矩阵,只有通过程序内部的具体代码来加以判断 。
M语言的函数文件不仅可以有一个输入参数和一个返回值,
还可以为 M语言函数文件定义多个输入参数和多个输出参数,
见例子 15。
第三章 matlab 提高 计算机仿真与模拟例子 15 多个输入、输出参数的 M函数。
001 function [avg,stdev,r] = ourstats(x,tol)
002 % OURSTATS 多输入输出参数示例
003 % 该函数计算处理矩阵,得到相应的均值、
004 % 标准差和矩阵的秩
005 [m,n] = size(x);
006 if m == 1
007 m = n;
008 end
009 % Average
010 avg = sum(x)/m;
第三章 matlab 提高 计算机仿真与模拟
011% Sandad deviation
012 stdev = sqrt(sum(x.^2)/m - avg.^2);
013 % Rank
014 s = svd(x);
015 r = sum(s > tol);
运行例子 15,在 MATLAB命令行中,键入下面的指令:
>> A = [ 1 2 3; 4 5 6]
A =
1 2 3
4 5 6
第三章 matlab 提高 计算机仿真与模拟
>> [a,s,r] = ourstats(A,0.1)
a =
2.5000 3.5000 4.5000
s =
1.5000 1.5000 1.5000
r =
2
>> ourstats(A,0.1)
ans =
2.5000 3.5000 4.5000
>> [a,s] = ourstats(A,0.1)
a =
2.5000 3.5000 4.5000
s =
1.5000 1.5000 1.5000
第三章 matlab 提高 计算机仿真与模拟例子 15的 M代码具有两个输入参数,三个输出参数,所以在使用该函数的时候,需要将必要的输入,输出参数写明 。 注意调用该函数时的语法,将输出参数依次写在一个向量中,若输出参数的个数与函数定义的输出参数个数不一致,则在例子
15中,将计算得到的前几个输出参数作为返回值,个数等于用户指定的输出参数个数 。 计算的结果依次赋值给不同的变量 。
在使用多个输入、输出参数的时候,往往需要判断用户写明的输入、输出参数的个数,若个数与函数定义不符合的时候,
将给出错误或者警告信息,这个时候,需要使用函数 nargin和
nargout来获取函数的输入、输出参数个数,见例子 16。
第三章 matlab 提高 计算机仿真与模拟例子 16 nargin和 nargout示例。
001 function c = testarg(a,b)
002 %TESTARG 检测输入输出参数个数
003 % 该函数根据不同的输入输出参数个
004 % 数进行相应的操作
005 if (nargout ~= 1)
006 disp('使用该函数必须指定一个输出参数 !');
007 return
008 end
009 switch nargin
010 case 0
第三章 matlab 提高 计算机仿真与模拟
011 disp('使用该函数至少需要一个输入参数 !');
012 c = [];
013 return
014 case 1
015 c = a.^2;
016 case 2
017 c = a+b;
018 end
第三章 matlab 提高 计算机仿真与模拟运行例子 16,在 MATLAB命令行窗口中,键入下面的指令:
>> A = [1 2 3];
>> B = [ 2 3 5];
>> testarg(A,B)
使用该函数必须指定一个输出参数 !
>> C = testarg
使用该函数至少需要一个输入参数 !
C =
[ ]
>> C = testarg(A)
C =
1 4 9
第三章 matlab 提高 计算机仿真与模拟
>> C = testarg(A,B)
C =
3 5 8
>> C = testarg(A,B,C)
Error using ==> testarg
Too many input arguments,
第三章 matlab 提高 计算机仿真与模拟运行例子 16的代码时,使用不同的输入,输出参数,函数本身和 MATLAB系统将自动检测参数的个数,在最后一次调用时,由于使用的输入参数个数超过了函数定义的个数,所以
MATLAB给出了错误信息 。
MATLAB的 M函数文件还可以具有个数不确定的输入、输出参数,也就是说,在定义 M函数文件的时候,不指明输入、
输出参数的个数,而是在程序中通过编写程序完成具体参数的确定,完成该功能主要依靠 varargin和 varargout函数。
第三章 matlab 提高 计算机仿真与模拟当函数的定义具有以下形式的时候
function y = function_name(varargin)
函数 function_name可以接受任意个数的输入参数;而当函数具有下面的形式时
function varargout = function_name(n)
函数 function_name可以输出任意个数的输出参数 。
可以将 varargin函数和 varargout函数结合在同一个 M文件函数中使用。
第三章 matlab 提高 计算机仿真与模拟例子 17 不确定的输入参数个数。
001 function y = varargin_example(varargin)
002 %VARARGIN_EXAMPLE 不确定输入参数例子
003 str = sprintf('输入参数的个数,= %d',length(varargin));
004 disp(str);
005 y = 0;
006 % varargin的类型
007 class(varargin)
008 for i = 1:length(varargin)
009 %varargin为元胞数组第三章 matlab 提高 计算机仿真与模拟
010 if(isnumeric(varargin{i}))
011 % 将每个为数值数组的输入参数
012 % 的第一个元素累加求和
013 y = y + varargin{i}(1);
014 end
015 end
第三章 matlab 提高 计算机仿真与模拟运行例子 17,在 MATLAB命令行中键入下面的指令:
>> varargin_example
输入参数的个数,= 0
ans =
cell
ans =
0
>> varargin_example('a',[1 2 3],3,rand(2,5))
输入参数的个数,= 4
ans =
cell
ans =
4.0153
第三章 matlab 提高 计算机仿真与模拟通过例子 17的运行结果和例子的代码可以看出 varargin函数的使用方法 。 它相当于在 MATLAB的函数入口处开辟了足够大的空间,用于接受各种用户的输入 。 在使用这个函数的时候,
需要在程序中判别函数输入参数的类别,并且从元胞数组中正确提取变量,在 MATLAB中将这一过程称之为 unpacking。
与之相对应的,将函数的输入参数传递给 varargout函数被称之为 packing,在这一过程中,需要将所有必要的输出参数传递给 varargout元胞数组,在传递参数的时候,还需要注意参数的顺序,在例子 18中介绍了这一过程。
第三章 matlab 提高 计算机仿真与模拟例子 18 不确定的输出参数。
001 function varargout=varargout_example(varargin)
002 %VARARGOUT_EXAMPLE不确定个数的输出参数
003
004 % 判断输出参数的个数
005 % 下面注释行中的代码执行有错误
006 % str = sprintf('输出参数的个数,=%d',length(varargout));
007 % 必须使用 nargout
008 str = sprintf('输出参数的个数,=%d',nargout);
009 disp(str);
010 if(nargout <= nargin)
011 for k=1:nargout
012 varargout{k} = varargin{nargin-k+1};
013 end
014 end
第三章 matlab 提高 计算机仿真与模拟运行例子 18的代码,在 MATLAB命令行中,键入下面的指令:
>> [a b] = varargout_example(1,2,3,4)
输出参数的个数,=2
a =
4
b =
3
第三章 matlab 提高 计算机仿真与模拟例子 18的第 006行代码,若将注释行符号,%”删除,则程序运行会出现错误 。 在程序中,若需要判断输出参数的个数不能使用 length函数,而需要使用 nargout函数 。 另外,在操作输出参数时,需要判断输出参数的个数,根据输出参数的个数完成相应的操作 。
在使用不确定的输入,输出参数时,还可以像下面的代码行一样使用这两个参数:
function [out1,out2] = example1(a,b,varargin)
function [i,j,varargout] = example2(x1,y1,x2,y2,flag)
若使用 varargout和 varargin参数,除了必须给定的参数以外,
其余的参数是任意数量可变的,具体的操作参阅例子 19。
第三章 matlab 提高 计算机仿真与模拟例子 19 可变的输入、输出参数。
001 function [x,y,varargout] = vararginout(a,b,c,d,varargin)
002 %VARARGINOUT 可变的输入输出参数
003 str = sprintf('输入参数的个数,=%d',nargin);
004 disp(str);
005 str = sprintf('输出参数的个数,=%d',nargout);
006 disp(str);
007 if(nargin <=4)
008 error('输入参数必须多于 4个 ');
009 end
010 % 处理输入输出参数第三章 matlab 提高 计算机仿真与模拟
011 x = a+b+c+d;
012 y = a-b+c-d;
013 if(nargout >2 && nargin>4)
014 for(i =1:nargout-2)
015 % 这里也许会出错,小心!
016 varargout{i} = varargin{end-i-1};
017 end
018 end
第三章 matlab 提高 计算机仿真与模拟运行例子 19的代码,在 MATLAB命令行中,键入下面的指令:
>> vararginout(1,2,3,4,5)
输入参数的个数,=5
输出参数的个数,=0
ans =
10
>> [a,b,c]=vararginout(1,2,3,4,5,6,7,8)
输入参数的个数,=8
输出参数的个数,=3
a =
10
b =
-2
c =
6
第三章 matlab 提高 计算机仿真与模拟
4.3 子函数和私有函数同一个 M函数文件中可以包含多个函数。如果在同一个 M
函数文件中包含了多个函数,那么将出现在文件中的第一个 M
函数称为主函数 (primary function),其余的函数称为子函数
(subfunction)。 M函数文件的名称一般与主函数的名称保持一致,
其他函数都必须按照函数的基本结构来书写,每一个函数的开始都是函数定义行,函数的结尾是另一个函数的定义行的开始或者整个 M文件的结尾 (最后一个子函数的结尾就是文件结束符 )。不过,子函数不像主函数,一般子函数没有在线帮助,子函数的作用范围有限,它只能被那些在定义子函数的 M文件中定义的函数 (包括主函数和其他子函数 )调用,不能被其他 M文件定义的函数调用。
第三章 matlab 提高 计算机仿真与模拟例子 20 子函数应用例子。
001 function [avg,med] = newstats(u) % 主函数
002 % NEWSTATS 计算均值和中间值
003 n = length(u);
004 avg = mean(u,n); % 调用子函数
005 med = median(u,n); % 调用子函数
006
007 function a = mean(v,n) % 子函数
008 % 计算平均值
009 a = sum(v)/n;
010
第三章 matlab 提高 计算机仿真与模拟
011 function m = median(v,n) % 子函数
012 % 计算中间值
013 w = sort(v);
014 if rem(n,2) == 1
015 m = w((n+1)/2);
016 else
017 m = (w(n/2)+w(n/2+1))/2;
018 end
第三章 matlab 提高 计算机仿真与模拟运行例子 20,在 MATALB命令行窗口中,键入下面的指令:
>> x = 1:11;
>> [mean,mid] = newstats(x)
mean =
6
mid =
6
第三章 matlab 提高 计算机仿真与模拟在 MATLAB中有一类函数被称为私有函数,这类函数被放置在名称为 private的子目录中。每一个函数文件都是标准的 M语言函数文件,没有特殊的关键字。但是,这些函数仅能被那些位于
private子目录的上一层目录中的函数调用。例如,假设在
MATLAB的搜索路径中包含路径 \ProjectA,那么所有位于
\ProjectA\private路径下的函数,只能在其上一层路径 \ProjectA中的函数文件中调用。由于私有函数作用范围的特殊性,不同父路径下的私有函数可以使用相同的函数名。由于 MATLAB搜索函数时优先搜索私有函数,所以如果同时存在私有函数名 func1.m和非私有函数名 func1.m,则私有函数 func1.m被优先执行。
创建私有函数的方法非常简单,只要将那些需要设置为私有的函数都拷贝到一个 private子目录中,则这些函数就能被那些位于父层目录中的 M函数调用了。
第三章 matlab 提高 计算机仿真与模拟在表 4中总结了子函数和私有函数的区别。
表 4 私有函数和子函数比较函数类型 子 函 数 私 有 函 数作用范围 同一个 M 函数文件内 在上层路径中的函数文件内结构保存在同一个 M 语言函数文件中,在 M
语言文件可以不包含任何子函数保存在子目录 p ri v a te 下第三章 matlab 提高 计算机仿真与模拟例子 21 私有函数的例子。
创建一个新的函数文件,代码如下:
001 function x = pmean(v,n)
002 %MEAN 私有函数例子
003 % 将该函数文件保存在 pivae子目录中,
004 % 则该函数仅能在上层目录的函数文件
005 % 中调用
006 disp('私有函数 mean');
007 x = sum(v)/n;
第三章 matlab 提高 计算机仿真与模拟图 3 将 pmean.m文件保存在 private目录下第三章 matlab 提高 计算机仿真与模拟接着,修改 newstats函数,并将其另存为 newstats1.m。
001 function [avg,med] = newstats1(u) % 主函数
002 % NEWSTATS 计算均值和中间值
003 n = length(u);
004 avg = mean(u,n); % 调用子函数
005 avg1 = pmean(u,n) % 调用私有函数
006 med = median(u,n); % 调用子函数
007
008 function a = mean(v,n) % 子函数
009 % 计算平均值
010 disp('子函数 mean');
011 a = sum(v)/n;
012,.....
第三章 matlab 提高 计算机仿真与模拟然后在 MATLAB命令行中,执行 newstats1.m函数:
>> newstats1(1:10);
子函数 mean
avg =
5.5000
私有函数 mean
avg1 =
5.5000
第三章 matlab 提高 计算机仿真与模拟
4.4 局部变量和全局变量同 C语言类似,在 M语言函数中也存在局部变量和全局变量 。 所谓局部变量,就是那些在 M函数内部声明并使用的变量 。
这些变量仅能在函数调用执行期间被使用,一旦函数结束运行,
则这些变量占用的内存空间将自动被释放,变量的数值也就不存在了 。 这是由于 MATLAB的解释器在解释执行函数的时候,
为不同的函数创建不同的工作空间,函数彼此的工作空间相互独立,一旦函数执行完毕,则函数的工作空间就不存在了 。
在前面的例子中,每个例子的函数内部声明使用的变量都是局部变量,所以函数执行完毕后,MATLAB的基本工作空间中没有这些变量存在,参见例子 22。
第三章 matlab 提高 计算机仿真与模拟例子 22 局部变量的例子。
001 function local
002 %LOCAL 察看局部变量的例子
003 x = rand(2,2);
004 y = zeros(2,2);
005 z = '函数中的变量 ';
006 u = {x,y,z};
007 disp(z)
008 whos
第三章 matlab 提高 计算机仿真与模拟运行例子 22,在 MATLAB命令行中,键入下面的指令:
>> local
函数中的变量
Name Size Bytes Class
u 1x3 256 cell array
x 2x2 32 double array
y 2x2 32 double array
z 1x6 12 char array
Grand total is 31 elements using 332 bytes
>> whos
第三章 matlab 提高 计算机仿真与模拟通过运行 local函数可以看到,所有在函数中创建的变量在函数运行结束后就不存在了 。 也就是说,局部变量的生存周期仅在函数的活动期间内 。
与局部变量相对应的就是全局变量 。 MATLAB将全局变量保存在特殊的工作空间进行统一维护,管理,而将变量声明为全局变量的方法就是在使用变量前,用关键字 global声明,例如声明全局变量 gXY:
>> global gXY
>> whos
Name Size Bytes Class
gXY 0x0 0 double array (global)
Grand total is 0 elements using 0 bytes
第三章 matlab 提高 计算机仿真与模拟需要强调一点,MATLAB管理,维护全局变量和局部变量使用了不同的工作空间,所以使用 global关键字创建全局变量的时候有三种情况:
(1) 若声明为全局的变量在当前的工作空间和全局工作空间都不存在,则创建一个新的变量,然后为这个变量赋值为空数组,该变量同时存在于局部工作空间和全局工作空间 。
(2) 若声明为全局的变量已经存在于全局工作空间中,则不会在全局工作空间创建新的变量,其数值同时赋值给局部工作空间中的变量 。
(3) 若声明为全局的变量存在于局部工作空间中,而全局工作空间不存在,则系统会提示一个警告信息,同时将局部的变量“挪”到全局工作空间中。
第三章 matlab 提高 计算机仿真与模拟例子 23 全局变量的例子。
在 MATLAB命令行窗口中,键入下面的指令:
>>% 创建全局变量并赋值
>> global myx
>> myx = 10;
>>% 变量的信息
>> whos
Name Size Bytes Class
myx 1x1 8 double array (global)
Grand total is 1 element using 8 bytes
第三章 matlab 提高 计算机仿真与模拟
>>% 清除变量
>> clear myx
>>% 察看信息
>> whos
>> whos global
Name Size Bytes Class
myx 1x1 8 double array (global)
Grand total is 1 element using 8 bytes
>>% 在局部工作空间再次创建变量
>> myx = 23
myx =
23
>>% 变量的信息第三章 matlab 提高 计算机仿真与模拟
>> whos
Name Size Bytes Class
myx 1x1 8 double array
Grand total is 1 element using 8 bytes
>>% 将其修改为全局变量 (注意警告信息 )
>> global myx
Warning,The value of local variables may have been changed to match the
globals,Future versions of MATLAB will require that you declare
a variable to be global before you use that variable.
>>%看看变量的数值
>> myx
myx =
10
第三章 matlab 提高 计算机仿真与模拟
>>% 清除当前的工作空间
>> clear
>> whos global
Name Size Bytes Class
myx 1x1 8 double array (global)
Grand total is 1 element using 8 bytes
>>% 清除所有的内存空间
>> clear all
>> whos global
第三章 matlab 提高 计算机仿真与模拟使用全局变量时,需要小心留意,因为全局变量可以在任何的函数中进行读写,这样,可能在比较复杂的程序中查找全局变量错误的时候就非常的麻烦 。
在 MATLAB中还有一类变量被声明为 persistent,将其称之为保留变量,这类变量类似于 C语言函数中被声明为 static类型的变量 。 这类变量在函数退出的时候不被释放,当函数再一次被调用的时候,这些变量保留上次函数退出时的数值 。 被声明为 persistent的变量具有以下特征:
* 变量仅能在声明变量的函数内使用,其他函数不能直接使用这些变量 。
* 函数执行退出后,MATLAB不清除这些变量占用的内存 。
* 当函数被清除或者重新编辑后,保留的变量被清除。
第三章 matlab 提高 计算机仿真与模拟例子 24 persistent关键字。
001 function y = persistent_example(x)
002 %PERSISTENT_EXAMPLE 保留变量使用示例
003 for i = 1:x
004 y = myfun;
005 end
006
007 function y = myfun
008 % 子函数
009 % persistent关键字的使用
010 persistent count;
第三章 matlab 提高 计算机仿真与模拟
011 % count记录函数调用的次数
012 if( isempty(count))
013 count = 1;
014 else
015 count = count + 1;
016 end
017 str = sprintf('第 %d次调用该函数 ',count);
018 disp(str);
019 y = count;
第三章 matlab 提高 计算机仿真与模拟在 MATLAB命令行窗口中,执行该函数:
>> persistent_example(2)
第 1次调用该函数第 2次调用该函数
ans =
2
>> persistent_example(3)
第 3次调用该函数第 4次调用该函数第 5次调用该函数
ans =
5
第三章 matlab 提高 计算机仿真与模拟从例子 24的执行情况可以看出变量 count记录了函数被调用的次数,如果在 MATLAB命令行中键入如下指令:
>> clear all
则所有的变量都会被清除,此时再次执行例子 24:
>> persistent_example(3)
第 1次调用该函数第 2次调用该函数第 3次调用该函数
ans =
3
count数值又重新计数了。
第三章 matlab 提高 计算机仿真与模拟由于使用全局变量有这样那样的危险性,所以建议尽量使用函数参数传递的方式来完成函数之间的数据共享,或者可以使用 persistent关键字将必要的变量保护起来。另外,
isglobal 命令可以用来测试本地变量与全局工作区中的变量是否存在联系,该命令并不能判断全局工作区中是否存在该变量。如果全局工作区中存在某个变量,但与本地工作区中的相应变量没有联系,isglobal函数返回值为 0 (假 )。
第三章 matlab 提高 计算机仿真与模拟
4.5 函数执行规则只要在 MATLAB的命令行窗口中键入函数的名称,并且提供足够的输入,输出参数就会得到正确的结果 。 如前文所述,
M语言的函数被 MATLAB的解释器解释,执行,所以,在本小节中将简要讨论一下解释器解释执行程序的问题 。
当用户在 MATLAB命令行窗口键入一条命令或者执行 M语言文件中包含的一条语句或者指令时,MATLAB解释器就负责解析用户的输入,并且给出相应的答案。 MATLAB解释器解析命令按照一定优先级进行:
第三章 matlab 提高 计算机仿真与模拟
* 首先判断输入的命令是否为变量 。
* 若不是内存中的变量,判断输入的命令是否为 MATLAB
的内建函数 。
* 若不是内建函数,则判断输入的命令是否为子函数 。
* 若不是子函数,则判断输入的命令是否为私有函数 。
* 若不是私有函数,则判断输入的命令是否为 MATLAB搜索路径中所包含的某个文件或函数 。
* 若在同一个路径下发现同名的三种类型的文件 MEX文件、
P代码文件和 M代码文件,则优先执行 MEX文件,其次是 P代码文件,最后执行的是 M语言文件。
第三章 matlab 提高 计算机仿真与模拟提示:
若需要了解具体调用的是哪一个对象,则可以使用 which命令获取相应的信息 。
这里需要注意的一点就是,MATLAB内存中的变量比函数具有较高的优先级,如例子 25所示。
第三章 matlab 提高 计算机仿真与模拟例子 25 MATLAB命令解析的优先级。
在 MATLAB命令行窗口中,键入下面的指令:
>> cos = 'This is a string!'
cos =
This is a string!
>> cos(4)
ans =
s
>> which cos
cos is a variable,
第三章 matlab 提高 计算机仿真与模拟
>> clear all
>> cos(4)
ans =
-0.6536
>> which cos
cos is a built-in function.
通过例子 25说明,MATLAB命令解释器在解释、执行
MATLAB指令时,将变量置于第一位。
第三章 matlab 提高 计算机仿真与模拟提示:
P代码 (伪代码 )文件是从 M 文件用 pcode命令生成的 。 伪代码是经过预编译的,无论何时函数被调用,MATLAB都能访问的现成代码 。 因为 P 文件是预编译过的,所以它们的实际内容对用户而言是不可读的,而且在一般情况下它们比相应的 M
文件运行速度快 。 将 M语言函数文件转变为 P代码文件的方法是
>> pcode fun1 fun2.........
MEX文件是一种特殊的文件格式,主要使用 C语言进行开发,并且经过编译后在 MATLAB环境中使用,关于 MEX文件的详细信息将在,MATLAB外部接口编程,一书中详细讨论。
第三章 matlab 提高 计算机仿真与模拟
4.5 M 文 件 调 试
M语言文件的编辑器 ——meditor不仅仅是一个文件编辑器,
同时还是一个可视化的调试开发环境 。 在 M文件编辑器中可以对
M脚本文件,函数文件进行调试,以排查程序的错误 。 M文件的调试不仅可以在文件编辑器中进行,而且还可以在命令行中结合具体的命令进行,但是过程相对麻烦一些,所以本小节将重点讲述在 M文件编辑器中进行可视化调试的过程 。
一般地来说,应用程序的错误有两类,一类是语法错误,另外一类是运行时的错误。其中,语法错误包括了词法或者文法的错误,例如函数名称的拼写错误等。而运行时的错误是指那些程序运行过程中得到的结果不是用户需要的情况。但是,由于 M文件是一种解释型语言,语法错误和运行时的错误都只有在运行过程中才能发现,所以程序的调试往往是在程序无法得到正确结果时进行程序修正的惟一手段。
第三章 matlab 提高 计算机仿真与模拟为了能够有效地处理各种情况,M语言的断点类型除了类似 C语言的用户定义的断点外,还有几种自动断点,分别为
* Stop if Error。
* Stop if Warning。
* Stop if NaN or Inf。
* Stop if All Errors。
这些自动断点可以在程序中设置,当程序运行过程中发生了错误或者警告,则程序运行中断,进入调试状态。
第三章 matlab 提高 计算机仿真与模拟图 4 M文件编辑器的 Debug菜单第三章 matlab 提高 计算机仿真与模拟例子 26 M文件调试代码 ——stats_error.m。
001 function [totalsum,average] = stats_error (input_vector)
002 % STATS_ERROR - Calculates cumulative total & average
003 totalsum = sum(input_vector);
004 average = ourmean(input_vector);
005
006 function y = ourmean (x)
007 % OURMEAN - Calculates average
008 [m,n] = size(x);
009 if m == 1
010 m = n;
011 end
012 y = sum(input_vector)/m;
第三章 matlab 提高 计算机仿真与模拟首先在 MATLAB环境中启动 M文件编辑器,然后选择 M文件编辑器中,Debug”菜单下的,Stop if Error/warrning”命令 。
注意,这时不一定需要将 stats_error.m文件在文件编辑器中打开 。
然后,在 MATLAB命令行窗口中键入下面的指令:
>> [sum avg] = stats_error(rand(1,50))
Undefined function or variable 'input_vector'.
Error in ==> stats_error>ourmean at 12
y = sum(input_vector)/m;
第三章 matlab 提高 计算机仿真与模拟图 5 处于调试状态的 M文件编辑器第三章 matlab 提高 计算机仿真与模拟在 M文件编辑器中,第 12行代码前有绿色的箭头,表示当前程序运行在此处中断 。 通过用户界面中的 Stack下拉框可以察看当前应用程序使用堆栈的状态,如本例子中 Stack下拉框中包含如下的内容,ourmean,stats_error和 Base,由下至上,
分别为调用者和被调用者之间的关系,同时也显示了当前的工作空间 。 另外,部分按钮从编辑状态进入调试状态,如图 4-6
所示 。
这些按钮分别执行增加断点、清除断点、单步执行等调试程序的功能。将鼠标光标移动到按钮处并保持几秒钟,
MATLAB的文件编辑能够给出相应的提示。
第三章 matlab 提高 计算机仿真与模拟图 4-6 调试程序的按钮第三章 matlab 提高 计算机仿真与模拟此时,MATLAB命令行窗口也处于调试状态,在这种状态下命令行提示符为,K>>”,在该命令行提示符中可以任意键入
MATLAB指令进行运算和处理,不过需要注意,此时的工作空间是函数正在应用的空间,若在命令行窗口中键入的指令影响了工作空间中的变量,则可以直接影响程序运行的结果 。
例如,在当前的提示符,K>>”键入下面的指令:
K>> whos
Name Size Bytes Class
m 1x1 8 double array
n 1x1 8 double array
x 1x50 400 double array
Grand total is 52 elements using 416 bytes
第三章 matlab 提高 计算机仿真与模拟可以看到,当前的工作空间下没有变量名 input_vector,这也是该程序执行出错的原因,将程序中第 12行的 input_vector修改成为 x就能得到正确的答案了 。
MATLAB可视化程序调试功能相对于 Visual C++的可视化调试功能弱了一些,但是,在调试程序的过程中通过 MATLAB
命令行窗口的配合,充分利用 MATLAB命令行窗口,演算纸,
的功能,能够非常方便地调试 M语言应用程序 。
另外,MATLAB也提供了一些指令用于进行 M文件的调试,
在表 5中对这些命令进行了总结。
第三章 matlab 提高 计算机仿真与模拟表 5 应用与调试 M文件的指令指 令 说 明
dbc lea r 清除已经设置好的断点
dbc ont 继续执行,等同于工具栏中的 按钮
dbd ow n/db up 修改当前工作空间的上、下文关系
dbq uit 退出调试状态
dbsta ck 显示当前堆栈的状态
dbsta tus 显示所有的已经设置的断点
dbste p 执行应用程序的一行或者多行代码
dbsto p 设置断点
dbty pe 显示 M 文件代码和相应的行号第三章 matlab 提高 计算机仿真与模拟其中,比较常用的指令是 dbquit,在可视化调试过程中,往往会出现没有退出调试状态就关闭了 M文件编辑器的情况,这时可以在,K>>”提示符下键入该指令退出调试状态。另外,在
startup.m文件中利用 dbstop指令预先设置自动断点为有效,这样就不必每次在调试应用程序前设置自动断点了。
第三章 matlab 提高 计算机仿真与模拟
4.6 M文件性能分析使用 M文件性能分析器有两种方法,其中一种方法是通过命令行,另外一种方法是通过图形用户界面 。 本小节分别介绍这两种使用 M文件性能分析器的方法 。
本小节用来分析的程序为例子 10 向 量 化 运 算 ——
array_vs_loops.m的代码 。
使用性能分析器的图形用户界面,通过执行 MATLAB的
,Start”菜单中,MATLAB”子菜单下的,Profiler”命令,得到性能分析器的用户界面,如图 7所示。
第三章 matlab 提高 计算机仿真与模拟图 7 性能分析器的图形用户界面第三章 matlab 提高 计算机仿真与模拟图 8 性能分析的总结报告第三章 matlab 提高 计算机仿真与模拟图 9 性能分析的详细报告 —— 执行次数报告第三章 matlab 提高 计算机仿真与模拟详细分析报告主要按照不同的项目统计了程序的执行,其中包括运行时间 (Time)、语句调用次数 (Number of Call)、覆盖率 (Coverage)、已加速的代码 (Acceleration)。从分析报告中就可以得出占用了较多计算处理时间的代码段或代码行。另外,通过性能分析器的报告也能看出使用数组运算大大提高了 M文件的执行性能。
第三章 matlab 提高 计算机仿真与模拟注意:
另外一种进行性能分析的方法是直接利用命令行的方式进行,这里主要用到一个函数 ——profile,该函数的主要使用方法为
profile keywords
其中,根据不同的关键字执行不同的功能,而使用的过程大体分为三个步骤:
首先,在 MATLAB命令行中键入下面的指令:
>> profile on
其中,关键字 on的作用是开启性能分析器,并且将前面的统计结果清除。
第三章 matlab 提高 计算机仿真与模拟注意:
当性能分析器处于开启状态时,MATLAB的状态栏显示
,Profile on”。
其次,运行需要分析的 M文件,例如,本小节使用的
array_vs_loops.m文件 。 运行文件的方法和正常运行 M文件的方法一致:
>> array_vs_loops
第三步,也就是最后一步,在 MATLAB命令行中键入下面的指令:
>> profile report
这时 MATLAB将分析的结果创建为一个超文本格式的文档,
该文档就是性能分析的总结文档,如图 10所示。
第三章 matlab 提高 计算机仿真与模拟图 10 性能分析结果第三章 matlab 提高 计算机仿真与模拟通过单击相应的超链接可以获取相应文件的分析报告,
其主要内容为每一行代码执行占用的时间。和使用图形用户界面的性能分析器相比较,这个分析报告的内容相对简单。
第三章 matlab 提高 计算机仿真与模拟图 11 性能分析的详细报告第三章 matlab 提高 计算机仿真与模拟表 6 profile函数的使用方法语 法 说 明
pr of ile o n 开启性能分析器,同时清除上一次的统计信息
pr of ile o f f 关闭性能分析器
pr of ile r e po rt 关闭性能分析器,同时输出超文本的报告
pr of ile p lo t 关闭性能分析器,同时以柱状图绘制统计结果
pr of ile r e su m e 重新开启性能分析器,保留前一次的统计结果
pr of ile c le a r 清除统计结果
pr of ile v ie w e r 打开图形界面的性能分析器
S = p ro fil e ( ‘ sta tu s ’ ) 将性能分析器的状态 保存在结构 S 中
S = p ro fil e ( ‘ in fo ’ ) 关闭性能分析器,同时将分析结果保存在结构 S 中第三章 matlab 提高 计算机仿真与模拟
7 小 结在本章主要讲述了关于如何利用 MATLAB的编程语言 ——
M语言进行编程的方方面面。 MATLAB提供了一种高级编程语言 —— M语言,这种语言的语法结构与 C语言非常类似,任何熟悉 C语言的用户学习使用 M语言都不会有任何障碍。尽管 M
语言是一种解释性的编程语言,但是随着 MATLAB版本的不断升级,以及充分利用 MATLAB提供的各种编程技巧,能够有效提高 M语言应用程序的执行效率,使 M语言成为了工程领域中最适合进行算法开发验证的编程语言。
第三章 matlab 提高 计算机仿真与模拟通过上面的学习之后,应该能够比较熟练地利用 M语言实现自己的想法 。 MATLAB是灵活,可靠的开发环境,用户不仅可以利用已有的 MATLAB的功能,而且还能够利用 M语言丰富
MATLAB的能力 。 通过学习,还能够充分利用 MATLAB新版本特性,以及 MATLAB丰富的编程调试工具 ——调试器和性能分析器,编写出高效率可靠的应用程序 。
第三章 matlab 提高 计算机仿真与模拟
3.2 图形基础
1 概述
2 基本二维绘图
3 格式化绘图
4 特殊图形函数
5 基本三维绘图
6 保存和输出图形
7 数据插值和曲线拟合第三章 matlab 提高 计算机仿真与模拟
1 概 述数据的可视化是 MATLAB的强大功能之一,而这仅仅是
MATLAB图形功能的一部分,MATLAB的图形功能主要包括数据可视化,创建用户图形界面和简单数据统计处理等,其中,
数据的可视化不仅仅是二维的,还可以在三维空间展示数据,
而数据或者图形的可视化也是进行数据处理或者图形图像处理的第一步骤 。
MATLAB的图形都是绘制在 MATLAB的图形窗体中的,而所有图形数据可视化的工作也都以图形窗体为主。 MATLAB图形窗体如图 1所示。
第三章 matlab 提高 计算机仿真与模拟图 1 MATLAB的图形窗体第三章 matlab 提高 计算机仿真与模拟
MATLAB的图形窗体主要包括如下几个部分:
* 菜单栏,MATLAB的图形窗体一般包括一个菜单栏,
利用这个菜单栏可以完成对窗体中各种对象的基本操作,例如图形的打印导出等 。
* 工具条:图形窗体的工具条用来完成对图形对象的一般性操作,例如新建,打开,保存和打印,还有对图形窗体的编辑也是通过该工具条完成的 。
* 绘图区域:图形窗体的绘图区域是面积最大的一部分,
在图 1中就是绘制了 MATLAB标志的矩形区域。在这个区域中可以绘制各种曲线,显示图形图像文件,以及完成对图形图像或者曲线的编辑。
第三章 matlab 提高 计算机仿真与模拟一般地,在 MATLAB中进行数据可视化的过程主要有如下步骤:
* 准备需要绘制在 MATLAB图形窗体中的数据 。
* 创建图形窗体,并且选择绘制数据的区域 。 一个
MATLAB图形窗体可以包含多个绘图区域 。
* 使用 MATLAB的绘图函数绘制图形或者曲线 。
* 设置曲线的属性,例如线型,线宽等 。
* 设置绘图区域的属性,并且添加数据网格线 。
* 为绘制的图形添加标题,轴标签或者标注文本等 。
* 打印或者导出图形。
第三章 matlab 提高 计算机仿真与模拟
2 基本二维绘图
2.1 基本绘图指令在 MATLAB中进行数据可视化使用最频繁的绘制函数就是
plot函数,该函数能够将向量或者矩阵中的数据绘制在图形窗体中,并且可以指定不同的线型和色彩 。 同一个 plot函数不仅能够绘制一条曲线,还可以一次绘制多条曲线 。
plot函数的基本使用语法格式为绘制一条曲线,plot(xdata,ydata,'color_linestyle_marker')
绘制多条曲线,plot(xdata1,ydata1,'clm1',xdata2,ydata2,
'clm2',......)
第三章 matlab 提高 计算机仿真与模拟例子 1 MATLAB基本绘图指令的使用 。
在 MATLAB命令行窗口中键入下面的指令:
>> x = 0:pi/1000:2*pi;
>> y = sin(2*x+pi/4);
>> plot(x,y)
例子 1共有三条指令,前面两条是准备绘制的数据,x和 y
两个变量为长度相同的行向量,其中 y是利用三角函数处理的数据。而 plot函数使用默认的设置将数据 x和 y绘制在图形窗体中。系统默认的设置为蓝色的连续线条。绘制的图形如图 2所示。
第三章 matlab 提高 计算机仿真与模拟图 2 在 MATLAB图形窗体中绘制蓝色曲线
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6 7
第三章 matlab 提高 计算机仿真与模拟
plot函数能够同时绘制多条曲线,在 MATLAB命令行窗口中,键入下面的指令:
(继续前面的指令 )
>> plot(x,y,x,y+1,x,y+2)
第三章 matlab 提高 计算机仿真与模拟图 3 绘制多条曲线第三章 matlab 提高 计算机仿真与模拟在图形窗体中,由下至上分别为绘制的第一,二,三条曲线,根据系统的默认设置分别为蓝色,绿色和红色 。
例子 1说明了 plot函数的基本用法,同时也说明了 plot函数的系统默认设置 。 不过例子中使用的数据是两个向量,分别作为 X轴的数据和 Y轴的数据 。 那么对于 MATLAB是如何处理的呢?
利用 plot函数可以直接将矩阵的数据绘制在图形窗体中,
这个时候 plot函数将矩阵的每一列数据作为一条曲线绘制在窗体中,如例子 6-2所示。
第三章 matlab 提高 计算机仿真与模拟例子 2 利用 plot函数绘制矩阵数据。
在 MATLAB命令行窗口中,键入下面的指令:
>> A = pascal(5)
A =
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 35
1 5 15 35 70
>> plot(A)
第三章 matlab 提高 计算机仿真与模拟图 4 绘制矩阵的数据
1 1,5 2 2,5 3 3,5 4 4,5 5
0
10
20
30
40
50
60
70
第五列数据第一列数据第三章 matlab 提高 计算机仿真与模拟
2.2 设置曲线的样式属性为了能够在 plot函数中控制曲线的样式,MATLAB预先设置了不同的曲线样式属性值,分别控制曲线的色彩、线型和标识符,在表 1中对 plot函数的标识符进行了总结。
第三章 matlab 提高 计算机仿真与模拟表 1 plot函数的标识符色彩 color 说明 时标 ma rker 说明 线型 linestyl e 说明
r 红色 + 加号 - 实线
g 绿色 o 圆圈 -- 虚线
b 蓝色 * 星号,点线
c 青,点 - 。 点划线
m 洋红 x 十字
y 黄色 s 矩形
k 黑色 d 菱形
w 白色 ^ 上三角
v 下三角
> 右三角
< 左三角
p 五边形
h 六边形第三章 matlab 提高 计算机仿真与模拟例子 3 设置曲线的样式。
在 MATLAB命令行窗口中,键入下面的指令:
>> t = 0:pi/20:2*pi;
>> y = sin(t);
>> y2 =sin(t-pi/2);
>> y3 = sin(t-pi);
>> plot(t,y,'-.rv',t,y2,'--ks',t,y3,':mp')
第三章 matlab 提高 计算机仿真与模拟例子 3在同一个图形窗体中绘制三条不同的曲线,为了区分这些曲线,使用了不同的时标、色彩和线型,绘制的曲线如图 5所示。
图 5 使用不同的样式绘制曲线
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6 7
第三章 matlab 提高 计算机仿真与模拟提示:常用的绘图命令为了能够更加直观地观察数据曲线,可以使用 grid命令将轴的坐标线绘制出来,具体的做法为 grid on。
执行该命令后,图形窗体的轴将显示坐标网格线,图 6就是将例子 3的结果添加上坐标网格线之后的效果。
第三章 matlab 提高 计算机仿真与模拟图 6 绘制坐标网格线
7
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6
第三章 matlab 提高 计算机仿真与模拟若不希望出现坐标网格线,则可以执行 grid off命令 。 执行
grid命令,图形窗体的轴将在有网格线和无网格线之间切换 。
若需要向已经存在曲线的图形窗体中增加曲线,则可以使用 hold on命令锁定当前的图形窗体,之后所有绘图操作的结果都会显示在当前的图形窗体中 。 使用 hold off命令则解除锁定状态,这时候任何绘图操作都将清除当前图形窗体已经绘制的内容 。 单纯使用 hold命令则将在锁定与非锁定状态之间切换 。
清除当前图形窗体内容的指令为 clf。创建新的图形窗体的指令为 figure。
第三章 matlab 提高 计算机仿真与模拟若不希望将绘制的曲线点连接起来,则在使用 plot函数绘制曲线的时候不要指定线条的样式,仅指定时标选项和色彩选项,这时就不会将绘制的点用线连接起来了 。 例如接例子 3执行下面的指令:
>> plot(t,y,'rv',t,y2,'ks',t,y3,'mp')
>> grid on
得到的图形如图 7所示。
第三章 matlab 提高 计算机仿真与模拟图 7 仅绘制曲线点
0
-1
- 0,8
- 0,6
- 0,4
- 0,2
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6 7
第三章 matlab 提高 计算机仿真与模拟
MATLAB还允许对利用 plot函数绘制的曲线进行更细致的控制,不过需要通过设置曲线的属性来完成 。 MATLAB图形对象都有自己的属性,通过修改属性就可以修改图形曲线的外观,
这也是句柄图形和图形用户界面操作图形对象的方法 。 绘制曲线时,可以通过修改下列属性完成对曲线细节的设置:
* LineWidth:曲线的宽度,单位为 point。
* MarkerEdgeColor:曲线时标边缘的色彩 。
* MarkerFaceColor:填充曲线时标的色彩 。
* MarkerSize:曲线时标的大小,单位为 point。
第三章 matlab 提高 计算机仿真与模拟例子 4 设置曲线的细节属性 。
在 MATLAB命令行窗口中,键入下面的指令:
>> x = -pi:pi/10:pi;
>> y = tan(sin(x)) - sin(tan(x));
>> plot(x,y,'--rs','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
例子 4中设置了曲线的线宽,Marker的填充色、边缘色等属性,于是得到的绘图结果如图 8所示。
第三章 matlab 提高 计算机仿真与模拟图 8 设置曲线的细节属性
-4 -3 -2 -1 0 1 2 3 4
-3
-2
-1
0
1
2
3
第三章 matlab 提高 计算机仿真与模拟
2.3 使用子图
MATLAB的图形窗体中不仅可以包含一个轴,还可以划分为多个图形显示区域,每个图形显示区域彼此独立,用户可以根据自己的需要把数据绘制在指定的区域中,这种特性就是利用 MATLAB图形窗体的子图功能来完成的 。 使用子图的方法非常简单,只要使用 subplot函数选择绘制区域即可 。
subplot函数把现有的图形窗体分割成指定行数和列数的区域,在每个区域内都可以包含一个绘图轴,利用该函数选择不同的绘图区,然后所有的绘图操作都将结果输出到指定的绘图区中。
第三章 matlab 提高 计算机仿真与模拟
subplot函数的基本用法如下:
subplot(m,n,p)
其中,m和 n为将图形窗体分割成的行数和列数,p为选定的窗体区域的序号,以行元素优先顺序排列 。
例如,在 MATLAB命令行窗口中键入指令:
>> subplot(2,3,4)
则 MATLAB将图形窗体分割成为二行三列,并且将第四个绘图区域设置为当前的绘图区域。例子 5说明了子图的使用方法。
第三章 matlab 提高 计算机仿真与模拟例子 5 使用子图 ——subplotex.m。
001 function subplotex
002 % 子图的使用示例
003 x = 0:.1:2*pi;
004 % 创建新的图形窗体
005 figure(1);clf;
006 % 分隔窗体为 2行 2列,分别在不同的区域绘图
007 subplot(2,2,1);plot(1:10);grid on;
008 subplot(2,2,2);plot(x,sin(x));grid on;
009 subplot(2,2,3);plot(x,exp(-x),'r');grid on;
010 subplot(2,2,4);plot(peaks);grid on;
第三章 matlab 提高 计算机仿真与模拟
011 % 子图的使用特别的用法
012 % 创建新的图形窗体
013 figure(2);clf
014 % 图形窗体分割为 4行 5列,选择第 2~4号区域
015 subplot(4,5,2:4);plot(1:10);grid on;
016 % 选择向量中指定的区域
017 subplot(4,5,[7 8 9 12 13 14]);plot(peaks);grid on;
018 % 选择单一的区域
019 subplot(4,5,11);plot(membrane);grid on;
020 % 选择多个区域
021 subplot(4,5,16:20);surf(membrane);grid on;
第三章 matlab 提高 计算机仿真与模拟注意在例子 5中,选择多个绘图区域时使用的 subplot函数的格式 。
运行例子 5的代码,在 MATLAB命令行窗口中,键入下面的指令:
>> subplotex
则 MATLAB创建两个图形窗体,分别绘制分割的图形,如图 9、
10所示。
第三章 matlab 提高 计算机仿真与模拟图 6-9 例子 5 代码 007行 ~010行的图形结果
0 5 10
0
2
4
6
8
10
0 2 4 6 8
-1
- 0,5
0
0,5
1
0 2 4 6 8
0
0,2
0,4
0,6
0,8
1
0 20 40 60
- 1 0
-5
0
5
10
第三章 matlab 提高 计算机仿真与模拟图 10 例子 6-5代码 014行 ~021行的图形结果
0 2 4 6 8 10
0
5
10
0 10 20 30 40 50
- 1 0
-5
0
5
10
0 20 40
-1
0
1
0
10
20
30
40
0
10
20
30
40
-1
0
1
第三章 matlab 提高 计算机仿真与模拟
2.4 控制绘图区域所谓 MATLAB的绘图区域是指图形窗体中的轴 (Axes),需要牢记一点,所有 MATLAB的图形对象都是绘制在轴的上面,
所以控制绘图的区域也就是控制轴的显示区域。利用 MATLAB
的图形功能绘制图形时,MATLAB自动地根据绘制的数据调整轴的显示范围,它能够保证将所遇的数据以适当的比例显示在轴中。用户同样可以修改轴显示的范围,而且还可以修改轴的标注,修改这些特性需要使用 axis函数,并且设置相应的属性。
第三章 matlab 提高 计算机仿真与模拟
axis函数可以修改图形窗体轴的范围,它的基本语法格式如下:
axis([xmin xmax ymin ymax])
其中,xmin和 xmax决定 X轴的显示范围,ymin和 ymax决定 Y轴的显示范围 。
若在 MATLAB命令行窗口中,直接键入下面的指令:
>> axis
ans =
0 1 0 1
则 MATLAB按照默认的设置自动创建一个图形窗体,包含一个空白的轴,其中 X轴的范围和 Y轴的范围都为 0~1。
第三章 matlab 提高 计算机仿真与模拟例子 6 axis函数使用示例。
在 MATLAB命令行窗口中,键入下面的指令:
>> x = 0:pi/100:pi/2;
>> y = tan(x);
>> plot(x,y,'ko')
>> grid on
第三章 matlab 提高 计算机仿真与模拟图 11 自动比例设置的图形窗体内容
0
2
4
6
8
10
12
14
16
18
x 1 0
15
0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6
第三章 matlab 提高 计算机仿真与模拟可以看出,由于默认的图形窗体轴能够根据数据的范围自动调节图形显示的比例,所以图 11显示的结果并不是那么直观,
绘制的数据几乎排成了一条直线,所以需要修改显示范围 。
>> axis([0,pi/2,0,5])
该命令将图形窗体轴的范围缩小,这时,前面数据的细节就可以很容易地查看出来了,如图 12所示 。
axis函数除了能够用来直接设置轴的范围外,还能够用来设置轴的行为,例如设置轴是否按照数据的范围自动调节等,
具体的用法请参阅 MATLAB的帮助文档或者在线帮助。
第三章 matlab 提高 计算机仿真与模拟图 12 设置轴的属性以查看数据的细节
0
0,5
1
1,5
2
2,5
3
3,5
4
4,5
5
0 0,5 1 1,5
第三章 matlab 提高 计算机仿真与模拟绘制曲线的轴还需要设置坐标线之间的间隔 (Ticks),在默认的情况下,MATLAB按照绘制数据的范围设置坐标线的间隔,
这种间隔的设置是自动完成的,用户也可以根据自己的需要设置这些间隔,具体的方法是通过设置轴的 XTick或者 YTick属性实现对 X轴或者 Y轴的坐标间隔设置,这里举例说明。
第三章 matlab 提高 计算机仿真与模拟例子 7 设置轴的坐标间隔。
在 MATLAB命令行窗口中,键入下面的指令:
>> x = -pi:pi/10:pi;
>> y = cos(x);
>> plot(x,y,'-r^');
>> grid on
第三章 matlab 提高 计算机仿真与模拟图 13 绘制曲线使用默认的坐标线间隔
-4 -3 -2 -1 0 1 2 3 4
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
默认的 X轴间隔第三章 matlab 提高 计算机仿真与模拟修改轴的坐标间隔属性,需要使用 set函数修改指定对象的 XTick或者 YTick属性值 。 在本例子中,修改 X轴的范围和坐标间隔:
>> axis([-pi,pi,-inf,inf])
>> set(gca,'XTick',-pi:pi/4:pi)
这时 MATLAB的图形窗体如图 14所示。
第三章 matlab 提高 计算机仿真与模拟图 14 设置坐标间隔线和坐标范围
- 3,1 4 1 6 - 2,3 5 6 2 - 1,5 7 0 8 - 0,7 8 5 4 0 0,7 8 5 4 1,5 7 0 8 2,3 5 6 2 3,1 4 1 6
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
自定义的 X轴间隔第三章 matlab 提高 计算机仿真与模拟注意:
在设置坐标轴的范围时,若将坐标轴取值设定为 inf(如例子 7),则表示该坐标轴的范围为自动,也就是说,在本例子中
X轴的范围为 [-π,π],则 Y轴按照绘制数据的范围自动设定 。
提示:
set函数和 get函数是用来设置 /获取 MATLAB图形对象属性的常用函数。 MATLAB的图形对象都包含有不同的属性和相应的属性数值,这些属性和属性值直接决定了 MATLAB图形对象的表现形式。例如在例子 7中设置了轴对象的属性 —— XTick,
修改之后 X轴的坐标间隔发生了变化。
第三章 matlab 提高 计算机仿真与模拟继续例子 7,在 MATLAB命令行窗口中键入下面的指令:
>> label = {‘-pi','',‘-pi/2','','0','','pi/2','','pi'}
label =
Columns 1 through 6
'-pi' '' ‘-pi/2' '' '0' ''
Columns 7 through 9
'pi/2' '' 'pi'
>> set(gca,'XTickLabel',label)
第三章 matlab 提高 计算机仿真与模拟图 15 设置 X轴的标注
-1
-0,8
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0,8
1
-p i -p i / 2 0 p i / 2 pi
自定义 X轴标注第三章 matlab 提高 计算机仿真与模拟
2.5 图形编辑器
MATLAB不仅能够显示数据和图形,而且还可以利用图形窗体中的工具对图形对象进行编辑,这时的图形窗体需要进入到编辑模式 。 在编辑模式下,可以向图形窗体中的对象添加文本,箭头,直线等,还可以利用 MATLAB提供的编辑工具完成图形对象的编辑工作 。
进入图形编辑模式有以下几种方法:
* 执行图形窗体中,Tool”菜单下的,Edit Plot”命令 。
* 单击图形窗体工具栏中选择对象按钮壁 。
第三章 matlab 提高 计算机仿真与模拟
* 执行,Edit”菜单下的菜单命令或者,Insert”菜单下的菜单命令都可以进入编辑 模式 。
* 在 MATLAB命令行窗口中,键入,plotedit”指令 。
进入图形编辑模式后,可以向图形添加各种元素,完成工作后,只要单击按钮就可以回到正常的显示模式 。
图形编辑模式下比较重要的工作是设置各种图形对象的属性,这里以设置轴对象的属性为例来说明这一过程。
第三章 matlab 提高 计算机仿真与模拟例子 8 利用图形编辑模式编辑轴对象属性 。
本例子使用例子 7的指令绘制基本的图形,请参阅例子 7
和图 13。
首先进入图形编辑模式,利用前面介绍的不同方法都能够进入编辑模式,进入编辑模式后,用鼠标单击轴,这时图形窗口如图 16所示。
第三章 matlab 提高 计算机仿真与模拟图 16 进入图形编辑模式,并选择轴对象第三章 matlab 提高 计算机仿真与模拟这时可以利用不同的方式打开轴对象的属性编辑器:
* 执行,Edit”菜单下的,Axes Properties”命令 。
* 执行鼠标右键快捷菜单下的,Properties”命令 。
* 在 MATLAB命令行窗口中键入指令 propedit,在弹出的图形属性对话框中选择轴 对象 。
轴对象的属性编辑器如图 17所示。
第三章 matlab 提高 计算机仿真与模拟图 17 轴属性编辑器第三章 matlab 提高 计算机仿真与模拟在轴属性编辑器中,可以设置 X,Y和 Z轴的属性,以及有关绘图的其他属性 。 这里需要将 X轴的属性设置成例子 7的数值 。 需要修改的地方包括 Limit,Tick和 Labels。
第三章 matlab 提高 计算机仿真与模拟图 18 设置轴对象属性得到的结果
- p i- p i / 2 0 p i / 2 p i
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
第三章 matlab 提高 计算机仿真与模拟
3 格 式 化 绘 图
3.1 增加文本信息
MATLAB图形窗体的文本信息主要包括图形标题,文本注释,
轴标签和图例等,图 19中的 MATLAB图形窗体包含了所有这些文本信息 。
为图形窗体增加这些文本信息一般有多种途径,或者通过菜单命令,或者通过属性编辑器,或者使用 MATLAB提供的函数 。
MATLAB的图形窗体 Insert菜单下包含多个菜单命令可以用来添加这些格式化的文本信息,而通过 MATLAB图形编辑器,配合不同对象的属性编辑器也可以完成添加格式化文本信息的工作 。 不过这些方法都没有利用函数编写程序简便,灵活,所以重点介绍利用函数添加格式化文本信息的方法 。
第三章 matlab 提高 计算机仿真与模拟图 19 MATLAB图形窗体的格式化文本第三章 matlab 提高 计算机仿真与模拟
1,添加标题 (title)
添加图形的标题需要使用 title函数,该函数的基本用法为
title('string')
其中,字符串 string为图形窗体的标题,该标题将被自动地设置在轴的正中顶部,例如在 MATLAB命令行窗口中,键入下面的指令:
>> title(date)
则 MATLAB会创建包含一个空白轴的图形窗体,同时将轴的标题设置为当前的日期,如图 20所示。
第三章 matlab 提高 计算机仿真与模拟图 20 以当前日期为标题的轴第三章 matlab 提高 计算机仿真与模拟
2,添加图例 (legend)
图例作为绘制在轴的数据曲线的说明,默认绘制在轴的右上角处,其中包括了绘制在轴内曲线的色彩,样式和时标,同时在绘制图例的地方为每一个曲线添加简要的说明文字,便于用户了解数据曲线的信息 。 添加轴的图例需要使用函数 legend,
该函数的基本语法为
legend('string1','string2'......)
其中,字符串 string1,string2为图例的说明性文本,MATLAB
将自动地按照绘制在轴上的曲线的绘制次序选择相应的文本作为图例 。 例如,假设在图形窗体上绘制如例子 3所示的三条曲线,为这三条曲线增加图例 。 在 MATLAB命令行窗口键入下面的指令:
>> legend('y=sin(t)','y=sin(t-pi/2)','y=sin(t-pi)')
第三章 matlab 提高 计算机仿真与模拟图 21 增加图例
y = s i n ( t )
y = s i n ( t - p i / 2 )
y = s i n ( t - p i )
-1
-0,8
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0,8
1
0 1 2 3 4 5 6 7
图例第三章 matlab 提高 计算机仿真与模拟通过图例可以非常方便地了解绘制在图形窗体中的曲线的基本信息。图例所在的位置可以任意地挪动,可以用鼠标直接在图形窗体中移动图例的位置,也可以在创建图表的时候,直接利用 legend函数设置图表的不同位置。具体的方法请参阅 MATLAB的帮助文档中关于 legend函数的说明。另外,
还可以使用句柄图形的方法设置图例的位置。
第三章 matlab 提高 计算机仿真与模拟
3,添加坐标轴标签 (label)
在 MATLAB中坐标轴的标签可以用来说明与坐标轴有关的信息,坐标轴标签也可以包含各种需要添加的信息,例如坐标轴数据的单位,物理意义等 。 MATLAB可以为不同的坐标轴添加不同的坐标信息,一般地,可以使用 xlabel,ylabel和
zlabel函数分别为图形窗体的 X轴,Y轴和 Z轴添加轴标签 。 以
X轴为例,这三个函数的基本使用语法如下:
xlabel('string')
其中,string就是坐标轴的标签。坐标轴的标签自动与坐标轴居中对齐。
第三章 matlab 提高 计算机仿真与模拟例如在图形窗体中为 X轴和 Y轴添加标签:
>> plot(sin(0:pi/100:pi))
>> xlabel('X轴数据 ');ylabel('Y轴数据 ')
添加标签之后的图形窗体内容如图 22所示。
第三章 matlab 提高 计算机仿真与模拟图 22 添加坐标轴标签
0 20 40 60 80 100 120
X 轴数据
Y
轴数据
0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
1
坐标轴标签第三章 matlab 提高 计算机仿真与模拟
4,添加文本注释 (text)
文本注释是由创建图形的用户添加的说明行文字,这些文字可以用来说明数据曲线的细节特点,比如,需要特别注意的数据点 。 创建文本注释的时候可以将文本注释首先保存在元胞数组中,然后使用 text函数完成向图形窗体添加文本注释的工作 。
text函数的基本语法为
text(x,y,'string')
其中,x和 y是文本注释添加的坐标值,该坐标值使用当前轴系的单位设置,这个坐标也就是文本起始点的坐标。
第三章 matlab 提高 计算机仿真与模拟例如可以向图形窗体添加文本:
>> x = 0:.1:2*pi;y = sin(x);plot(x,y)
>> text(pi/3,sin(pi/3),'<--Sin(\pi/3)')
这里通过调用 text函数,把文本注释添加到了图形曲线上,
如图 23所示。
第三章 matlab 提高 计算机仿真与模拟图 23 添加文本注释
0 1 2 3 4 5 6 7
< - - S i n (? / 3 )
-1
-0,8
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0,8
1
文本注释第三章 matlab 提高 计算机仿真与模拟
3.2 格式化文本标注在 3.1小节的例子中添加的各种文本标注都使用了系统默认的字体、字号等属性设置,若是所有的图形文本注释都使用这些格式显得千篇一律,所以这些文本的属性也可以进行修改,
修改这些属性可以通过 set命令,而前提是需要获取相应图形对象的句柄。介绍创建格式化文本标注的方法。
第三章 matlab 提高 计算机仿真与模拟文本标注的字体属性可以在创建文本标注的时候进行设置,其中有关字体本身的属性包括:
* FontName:字体名称,例如 Courier,隶书等 。
* FontSize:字体大小,整数值,默认为 10 points。
* FontWeight:设置字体的加粗属性 。
* FontUnits:字体大小的度量单位,默认为 point。
可以在创建文本注释的同时就设置这些文本相应的属性值,
在例子 9中,分别设置了文本注释的这些属性。
第三章 matlab 提高 计算机仿真与模拟例子 9 添加格式化的文本信息 ——txtinfo.m。
001 %使用不同的文本标注属性
002 % 准备数据并绘制曲线
003 x = 0:.1:2*pi;y = sin(x);plot(x,y)
004 grid on;hold on
005 plot(x,exp(-x),'r:*');
006 % 添加标注
007 title('2-D Plots','FontName','Arial','FontSize',16)
008 % 使用中文字体第三章 matlab 提高 计算机仿真与模拟
009 xlabel('时间 ','FontName','隶书 ','FontSize',16)
010 % 加粗文本
011ylabel('Sin(t)','FontWeight','Bold')
012 % 修改字号
013 text(pi/3,sin(pi/3),'<--Sin(\pi/3)','FontSize',12)
014 legend('Sine Wave','Decaying Exponential')
015 hold off
执行脚本文件 txtinfo,在 MATLAB命令行窗口中键入下面的指令:
>> clear all
>> txtinfo
第三章 matlab 提高 计算机仿真与模拟得到的图形输出如图 24所示。
图 24 设置不同文本属性的文本标注
0 1 2 3 4 5 6 7
2 -D P l o t s
时间
S
i
n
(
t
)
< - - S i n (? / 3 )
S i n e W av e
D ec ay i n g E x p o n en t i al
-1
-0,8
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0,8
1
第三章 matlab 提高 计算机仿真与模拟
3.3 特殊字符标注在 3.1小节和例子 9中,都使用了特殊的字符集来显示字符
π,而显示字符 π的方法就是利用了 LaTeX字符集 。 利用这个字符集和 MATLAB文本注释的定义,就可以在 MATLAB的图形文本标注中使用希腊字符,数学符号或者上标和下标字体等 。
第三章 matlab 提高 计算机仿真与模拟在 MATLAB图形窗体的所有文本标注中都可以使用这些特殊的文本,比如在标题,坐标轴标签,文本注释中,使用特殊文本时一定要注意不要忘记,\”符号,否则 MATLAB就会按照普通文本处理这些字符 。 还可以用下面的标识符组合完成更丰富的字体标注 。
* \bf:加粗字体 。
\it:斜体字。
* \sl:斜体字 (很少使用 )。
* \rm:正常字体 。
* \fontname{fontname}:定义使用特殊的字体名称 。
* \fontsize{fontsize}:定义使用特殊的字体大小,单位为
FontUnits。
第三章 matlab 提高 计算机仿真与模拟设置字体的大小或者名称将直接影响接在定义符后面的文本内容,直到下一个字体定义符出现 。
进行上标或者下标文本的注释需要使用,_”和,^”字符 。
进行上标标注的方法如下:
^{superstring}
其中,superstring是上标的内容,它必须添加在大括号,{}”之中 。
进行下标标注时的标注方法如下:
_{substring}
其中,substring是下标的内容,它必须添加在大括号,{}”之中 。
关于在 MATLAB文本标注中添加特殊的文本的具体方法参见例子 10。
第三章 matlab 提高 计算机仿真与模拟例子 10 使用特殊文本标注 ——Latex_examp.m。
001 function latex_examp
002 %LATEX_EXAMP 在文本注释中使用特殊文本
003 alpha = -0.5;
004 beta = 3;
005 A = 50;
006 t = 0:.01:10;
007 y = A*exp(alpha*t).*sin(beta*t);
008 % 绘制曲线
009 plot(t,y);
010 %添加特殊文本注释第三章 matlab 提高 计算机仿真与模拟
011 title('\fontname{ 隶书 }\fontsize{16}{ 隶书 }
\fontname{Impact}{Impact}')
012 xlabel('^{上标 } and _{下标 }')
013 ylabel('Some \bf粗体 \rm and some \it{斜体 }')
014 txt = {'y = {\itAe}^{\alphax}sin(\beta\itt)',...
015 ['\itA\rm',' = ',num2str(A)],...
016 ['\alpha = ',num2str(alpha)],...
017 ['\beta = ',num2str(beta)]};
018 text(2,22,txt );
运行例子 10,在 MATLAB命令行窗口中键入指令:
>> latex_examp
第三章 matlab 提高 计算机仿真与模拟图 25 使用特殊文本注释
0 1 2 3 4 5 6 7 8 9 10
- 3 0
- 2 0
- 1 0
0
10
20
30
40
隶书 Im p a c t
上标
a n d
下标
S
o
m
e
粗体
a
n
d
s
o
m
e
斜体
y = Ae
x
s i n (? t)
A = 5 0
= - 0,5
= 3
第三章 matlab 提高 计算机仿真与模拟特殊文本注释可以放置在各种文本注释的内容中,在例子 10中,011~018行的代码分别在标题、坐标轴标签、文本注释内容中添加了特殊文本。注意,在需要添加多行文本注释的时候,需要将注释的内容保存在元胞数组中,元胞数组的每一个元胞即为注释的一行,就像 014行创建的变量 txt一样。
第三章 matlab 提高 计算机仿真与模拟
3.4 简单数据统计信息
MATLAB的图形窗体同时提供了简单数据统计的功能,这些功能是通过调用 MATLAB的基本数学函数完成的。不过在图形窗体中使用数据统计功能,可以将统计的结构直接绘制在
MATLAB图形窗体中,而且这些结果也能够保存到 MATLAB
的工作空间。
第三章 matlab 提高 计算机仿真与模拟例子 11 简单数据统计工具的基本用法。
本例子使用的脚本文件为 census_stats.m,该文件的内容如下:
001 % CENSUS_STATS 简单数据统计工具使用示例
002 % 加载数据,数据为 MATLAB自带的 DEMO
003 load census;
004 % 绘制曲线
005 plot(cdate,pop,'ko');
006 hold on;grid on;
007 legend('人口 ');
008 title('人口普查信息 ');
009 xlabel('时间 (年 )'); ylabel('人口数 (百万 )');
第三章 matlab 提高 计算机仿真与模拟提示:
本例子使用的数据来自于 MATLAB自带的 Demo,关于该
MATLAB自带例子的信息请参阅在线帮助,help census。
在 MATLAB命令行窗口中,键入下面的指令:
>> census_stats
这时得到的图形窗体内容如图 26所示。
第三章 matlab 提高 计算机仿真与模拟图 26 人口数据绘图
1 7 5 0 1 8 0 0 1 8 5 0 1 9 0 0 1 9 5 0 2 0 0 0
人口普查信息时间 ( 年 )
人口
0
50
1 0 0
1 5 0
2 0 0
2 5 0
人口数(
百万)
第三章 matlab 提高 计算机仿真与模拟为了进行简单数据统计,需要通过菜单命令。执行图形窗体,Tool”菜单下的,Data Statistics”命令,弹出数据统计对话框,如图 6-27所示。
图 6-27 数据统计对话框第三章 matlab 提高 计算机仿真与模拟在数据统计对话框中,对 X轴和 Y轴的数据进行了简要的统计计算,其中包括了最大值、最小值、均值、中值、标准差和取值范围。通过选择每一组数据边上的复选框,就可以将不同的统计计算结果绘制在图形窗体中,比如在例子 11中选择 Y轴数据的均值 (mean),这时的图形窗体如图 28所示。
第三章 matlab 提高 计算机仿真与模拟图 28 添加数据统计信息
1750 1800 1850 1900 1950 2000
0
50
100
150
200
250
人口普查信息时间 ( 年 )
人口数
(
百万
)
人口
y m e a n
第三章 matlab 提高 计算机仿真与模拟依此类推,可以将其他的统计结果绘制在图形中 。
单击数据统计对话框中的,Save to workspace”按钮可以将统计计算的结果保存到工作空间,在弹出的对话框中选择 Y
轴的数据,并且编辑变量名,如图 29所示。
第三章 matlab 提高 计算机仿真与模拟图 29 将统计结果保存到工作空间中第三章 matlab 提高 计算机仿真与模拟保存到工作空间的变量是一个结构:
>> whos
Name Size Bytes Class
cdate 21x1 168 double array
censusstats 1x1 792 struct array
pop 21x1 168 double array
Grand total is 54 elements using 1128 bytes
>> censusstats
censusstats =
第三章 matlab 提高 计算机仿真与模拟
min,3.9000
max,248.7000
mean,85.7286
median,62.9000
std,78.6011
range,244.8000
第三章 matlab 提高 计算机仿真与模拟关闭图形窗体的同时自动关闭数据统计工具。若图形窗体中绘制有多条曲线,则可以通过选择数据统计工具对话框的,Statistics for”下拉框中的不同数据进行统计分析。而且,
一旦打开数据统计工具对话框,则统计工具自动对图形窗体中的数据进行更新计算,若修改了图形窗体中的曲线,则统计工具自动重新进行计算,并绘制结果。
第三章 matlab 提高 计算机仿真与模拟
4 特殊图形函数
4.1 特殊坐标轴系
MATLAB为数据的 2D图形显示提供了很多函数,以下函数都是基本二维画线的函数,它们采用了不同的坐标刻度 ——
对数坐标系 。 因此在绘制特殊坐标轴系曲线的时候,需要分别使用不同的函数:
* loglog:两个坐标轴都使用对数刻度 。
* semilogx,x轴用对数刻度,y 轴用普通线性刻度 。
* semilogy,y轴用对数刻度,x轴用普通线性刻度。
第三章 matlab 提高 计算机仿真与模拟还有一个 plotyy函数,它能够将两组不相关的数据绘制在同一个图形窗体中,而且每一组数据都使用不同的 Y坐标系 。
例子 12 使用特殊的坐标轴系 。
执行包含下列代码的脚本文件:
001 %OTHER_AXES特殊坐标系示例
002 data = 1:1000;
003 subplot(2,2,1);loglog(data);grid on;
004 title('LOGLOG(1:1000)')
005 subplot(2,2,2);semilogy(data);grid on;
第三章 matlab 提高 计算机仿真与模拟
006 title('SEMILOGY(1:1000)');
007 subplot(2,2,3);semilogx(data);grid on;
008 title('SEMILOGX(1:1000)')
009 subplot(2,2,4);plotyy(data,data,data,data.^2);
010 grid on;
011 title('PLOTYY');
第三章 matlab 提高 计算机仿真与模拟图 30 使用特殊的坐标轴系第三章 matlab 提高 计算机仿真与模拟
4.2 绘制特殊图形在 MATLAB中能够绘制的特殊图形包括条状图和面积图、
饼图、柱状图、离散数据图、矢量方向图以及等高线图等,这些特殊图形的绘制一般都是通过一个函数的调用完成的。不同的特殊图形绘制函数应用面不同,需要根据特殊的数据可视化和统计要求选择。
第三章 matlab 提高 计算机仿真与模拟
1,条状图和面积图绘制条状图和面积图的函数如下:
* bar:绘制二维条状图,将 m行 n列的矩阵绘制成 m组,每组 n个垂直条 (bar)。
* barh:绘制二维水平条状图,将 m行 n列的矩阵绘制成 m
组,每组 n个水平条 (bar)。
* bar3:绘制三维条状图,将 m行 n列的矩阵绘制成 m组,
每组 n个垂直条 (bar)。
* barh3:绘制三维水平条状图,将 m行 n列的矩阵绘制成 m
组,每组 n个水平条 (bar)。
* area:绘制面积图,将向量数据绘制成面积图。
第三章 matlab 提高 计算机仿真与模拟执行包含下面代码的脚本文件能够得到如图 31所示的结果 。
001 %BAR_EXAMP条状图和面积图示例
002 data = [10 2 3 5; 5 8 10 3; 9 7 6 1; 3 5 7 2; 4 7 5 3];
003 subplot(2,2,[1 2]);bar(data);
004 title('垂直条状图 (2D)');
005 subplot(2,2,3);bar3h(data);
006 title('水平条状图 (3D)');
007 subplot(2,2,4);area(data);
008 title('面积图 ');
第三章 matlab 提高 计算机仿真与模拟图 31 条状图和面积图示例
1 2 3 4 5
0
2
4
6
8
10
垂直条状图 ( 2 D )
0
5
10
1
2
3
4
5
水平条状图 ( 3 D )
1 2 3 4 5
0
10
20
30
面积图第三章 matlab 提高 计算机仿真与模拟
2,饼图饼图用来显示向量或者矩阵元素占所有元素和的百分比 。
饼图也有二维饼图和三维饼图,绘制的函数分别为 pie和 pie3。
执行包含下面代码的脚本文件能够得到如图 32所示的结果 。
001 %PIE_EXAMP 饼图示例
002 A = sum(rand(5,5));
003 subplot(2,2,1);pie(A);
004 title('完整饼图 (2D)');
005 subplot(2,2,2);pie3(A);
006 title('完整饼图 (3D)');
007 B = [0.18 0.22 0.35];
第三章 matlab 提高 计算机仿真与模拟
008 subplot(2,2,3),pie(B);
009 title('缺角饼图 (2D)');
010 subplot(2,2,4),pie3(B);
011 title('缺角饼图 (3D)');
第三章 matlab 提高 计算机仿真与模拟图 32 饼图示例
2 6 %
2 0 %
2 0 %
1 8 %
1 7 %
完整饼图 ( 2 D )
2 0 %
1 8 %
完整饼图 ( 3 D )
1 7 %
2 0 %
2 6 %
1 8 %
2 2 %
3 5 %
缺角饼图( 2 D )
3 5 %
缺角饼图 ( 3 D )
2 2 %
1 8 %
第三章 matlab 提高 计算机仿真与模拟
3,柱状图柱状图 (直方图 )用来显示数据的分布情况,比如显示一组数据的概率分布情况 。 柱状图可以绘制在普通的直角坐标下,也可以绘制在极坐标下,使用的函数分别为 hist和 rose。
这两个函数分别计算输入向量中数据落入某一范围的数量,
而绘制的柱状高度或者长度则表示落入该范围的数据的个数 。
执行包含下列代码的脚本文件能够得到如图 33所示的结果 。
001 %HIST_EXAMP 柱状图示例
002 A = randn(100000,1);
003 B = rand(100000,1);
第三章 matlab 提高 计算机仿真与模拟
004 subplot(2,2,1);hist(A);
005 title('正态分布 ');
006 subplot(2,2,2);hist(B);
007 title('均匀分布 ');
008 subplot(2,2,3);rose(A);
009 title('正态分布 ');
010 subplot(2,2,4);rose(B);
011 title('均匀分布 ');
第三章 matlab 提高 计算机仿真与模拟
-5 0 5
0
1
2
3
4
x 1 0
4
正态分布
0 0,5 1
0
5 0 0 0
1 0 0 0 0
1 5 0 0 0
均匀分布
1 0 0 0 0
2 0 0 0 0
30
210
60
240
90
270
120
300
150
330
180 0
正态分布
2 0 0 0 0
4 0 0 0 0
30
210
60
240
90
270
120
300
150
330
180 0
均匀分布图 33 柱状图示例第三章 matlab 提高 计算机仿真与模拟
4,离散数据图在数字信号处理领域经常处理一些离散的数据,而
MATLAB提供了相应的函数供用户进行离散数据的绘制,例如常用的火柴杆图,阶梯图等 。 前面介绍的柱状图也是绘制离散数据的一种选择 。
绘制火柴杆图可以使用 stem函数或者 stem3函数,前者绘制二维空间的曲线,后者绘制三维空间的曲线,而阶梯图需要使用 stairs函数 。
例如绘制离散数据图的脚本文件 —— stem_examp如下:
第三章 matlab 提高 计算机仿真与模拟
001 %STEM_EXAMP离散数据图示例
002 alpha =,01; beta =,5; t = 0:0.2:10;
003 y = exp(-alpha*t).*sin(beta*t);
004 stem(t,y,'r');grid on;hold on;
005 stairs(t,y,'g');
006 plot(t,y,'b');
007 figure
008 theta = 2*pi*(0:127)/128;
009 x = cos(theta);
010 y = sin(theta);
011 z = abs(fft(ones(10,1),128))';
012 stem3(x,y,z)
第三章 matlab 提高 计算机仿真与模拟图 34 离散数据图示例
0 1 2 3 4 5 6 7 8 9 10
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
-1
- 0,5
0
0,5
1
-1
- 0,5
0
0,5
1
0
2
4
6
8
10
第三章 matlab 提高 计算机仿真与模拟注意:
在绘制三维火柴杆图的时候使用了快速傅立叶函数,该函数是数字信号处理常用的函数之一,为 MATLAB的内建函数 。
除了上述四种类型的特殊绘图函数以外,MATLAB还能够绘制矢量方向图和等高线图,这些函数包括
* compass,绘制放射线图 。
* feather:绘制线性放射线图 。
* quiver:绘制场图 。
* quiver3:绘制三维场图。
第三章 matlab 提高 计算机仿真与模拟
* contour:绘制等高线轮廓图。
* contour3:绘制三维等高线轮廓图。
* contourf:绘制填充的等高线图。
* clabel:标识等高线标签。
* meshc:绘制三维 mesh曲线和等高线。
* surfc:绘制三维 surf曲线和等高线。
第三章 matlab 提高 计算机仿真与模拟例如使用上述函数绘制特殊图形的脚本文件如下:
001 %OTHERS矢量方向图绘制示例
002 subplot(2,2,1)
003 [X,Y,Z] = peaks(-2:0.25:2);
004 [U,V] = gradient(Z,0.25);
005 contour(X,Y,Z,10);
006 hold on
007 quiver(X,Y,U,V);
008 title('表面梯度 - (CONTOUR & QUIVER)')
009 subplot(2,2,2)
第三章 matlab 提高 计算机仿真与模拟
010 contourf(X,Y,Z,10);
011 title('填充等高线 - (CONTOURF)')
012 theta = 0:0.1:4*pi;
013 [x,y] = pol2cart(theta(1:5:end),theta(1:5:end));
014 subplot(2,2,3)
015 compass(x,y)
016 title('放射线图 - (COMPASS)')
017 subplot(2,2,4)
018 feather(x(1:19),y(1:19))
019 title('线性放射线图 - (FEATHER)')
第三章 matlab 提高 计算机仿真与模拟图 35 特殊图形绘制示例第三章 matlab 提高 计算机仿真与模拟
6.5 基本三维绘图三维图形的表现能力要强于二维图形,在很多时候需要使用 MATLAB绘制三维图形的能力。 MATLAB提供了若干函数进行三维数据可视化,同时还有若干种方法进行三维图形对象属性的设置和控制。
第三章 matlab 提高 计算机仿真与模拟绘制三维图形的基本过程要比绘制二维图形复杂一些,基本过程如下:
(1) 准备需要绘制在 MATLAB图形窗体中的数据。
(2) 创建图形窗体,并且选择绘制数据的区域。
(3) 使用 MATLAB的 3D绘图函数绘制图形或者曲线。
(4) 设置调色板和投影算法。
(5) 增加光照,设置材质。
(6) 设置视点 (viewpoint)。
(7) 设置绘图坐标轴的属性。
(8) 设置透视比。
(9) 为绘制的图形添加标题、轴标签或者标注文本等。
(10) 打印或者导出图形。
第三章 matlab 提高 计算机仿真与模拟例子 6-14 简单三维绘图。
例子 6-14的脚本文件代码如下:
001 %PLOT_3D 简单三维绘图
002 % 准备数据
003 z = 0:0.1:40;
004 x = cos(z);
005 y = sin(z);
006 clf;
007 % 绘制曲线
008 plot3(x,y,z)
009 % 添加标注第三章 matlab 提高 计算机仿真与模拟
010 grid on
011 title('Spiral Plot - using PLOT3')
012 xlabel('x')
013 ylabel('y')
014 zlabel('z')
第三章 matlab 提高 计算机仿真与模拟图 6-40 简单的三维绘图第三章 matlab 提高 计算机仿真与模拟例子 6-14中使用了函数 plot3,该函数类似 plot函数,能够将 X,Y,Z坐标绘制在三维的空间,它的基本语法如下:
plot3(xdata,ydata,zdata,'clm',......)
在命令行中,clm的取值和 plot函数的取值完全一致 。
在例子 6-14的代码中,使用 zlabel函数向坐标轴添加标签,
它的用法类似于 xlabel和 ylabel函数 。
在例子 6-14中,没有进行其他复杂的操作,比如设置光线、
视点和三维实体的表面材质等特性。在例子 6-15中完整地演示了绘制三维曲面的过程。
第三章 matlab 提高 计算机仿真与模拟例子 6-15 绘制复杂的三维曲面。
例子 6-15使用的脚本文件如下:
001 %准备数据
002 Z = peaks(20);
003 %选择图形窗体
004 figure(1);clf
005 %调用 3D绘图函数
006 h = surf(Z);
007 %设置调色板和投影算法
008 colormap hot;
第三章 matlab 提高 计算机仿真与模拟
009 shading interp;
010 set(h,'EdgeColor','k')
011 %增加光照
012 light('Position',[-2,2,20])
013 lighting phong
014 %设置材质
015 material([0.4,0.6,0.5,30])
016 set(h,'FaceColor',[0 0.7 0.7],...
017 'BackFaceLighting','lit')
018 %设置视点第三章 matlab 提高 计算机仿真与模拟
019 view([30,25])
020 set(gca,'CameraViewAngleMode','Manual')
021 %设置轴属性
022 axis([0 20 0 20 -8 8])
023 set(gca,'ZTickLabel','Negative||Positive')
024 %设置透视比
025 set(gca,'PlotBoxAspectRatio',[2.5 2.5 1])
026 %添加文本注释
027 xlabel('X Axis');ylabel('Y Axis');zlabel('Function Value');
028 title('Peaks');
第三章 matlab 提高 计算机仿真与模拟图 6-41 代码运行的中间结果第三章 matlab 提高 计算机仿真与模拟图 6-42 程序运行的最终结果第三章 matlab 提高 计算机仿真与模拟在例子 6-15的代码中使用了很多三维图形属性设置的函数以及大量的图形对象属性,这些内容已经超出了本书的讨论范围,有兴趣的读者可以结合例子的代码阅读 MATLAB的帮助文档或者函数的在线帮助 。
为了便于绘制三维图形,MATLAB提供了一些函数用于特殊的三维曲面绘制,其中经常使用的函数有 mesh函数和 surf函数 。
mesh函数用来绘制三维的线框图,它的输入参数一般为 X、
Y和 Z三个坐标系的数据,同时该函数还有 meshc和 meshz函数两种变形,其中 meshc函数用来绘制具有等高线性质的 mesh曲面,meshz函数用于绘制 mesh曲面的参考面,这三个函数的使用参见例子 6-16。
第三章 matlab 提高 计算机仿真与模拟例子 6-16 mesh函数的应用。
例子 6-16的脚本文件包含下列代码:
001 % MESH_EXAMP mesh函数举例
002 % 准备数据
003 [X,Y] = meshgrid(-3:.125:3);
004 Z = peaks(X,Y);
005 subplot(1,3,1);
006 meshc(X,Y,Z);
007 axis([-3 3 -3 3 -10 5]);title('Meshc');
008 subplot(1,3,2);
009 meshz(X,Y,Z);
第三章 matlab 提高 计算机仿真与模拟
010 axis([-3 3 -3 3 -10 5]);title('MeshZ');
011 subplot(1,3,3);
012 mesh(X,Y,Z);
013 axis([-3 3 -3 3 -10 5]);title('Mesh');
014 colormap gray
015 set(gcf,'Position',[14 237 997 275]);
第三章 matlab 提高 计算机仿真与模拟图 6-43 mesh函数使用示例例子 6-16的运行结果如图 6-43所示。
第三章 matlab 提高 计算机仿真与模拟在例子 6-16中,使用了 meshgrid函数创建二维的网格数据 。
meshgrid函数可以用来创建三维曲线绘图的原始数据,它根据输入参数,创建等间距的网格数据 。 关于 meshgrid函数的详细信息请参阅 MATLAB的帮助文档或者函数的在线帮助 。
通过例子 6-16的运行结果能够明显地看出函数 mesh、
mehsc,meshz之间的区别 。 有关 mesh函数的详细使用方法请参阅 MATLAB的帮助文档 。
surf函数和 mesh函数不同,surf函数能够创建用色彩表示的曲面图,而不是线框图,而且该函数有一种变形,就是 surfc。
所以,若将例子 6-16的代码进行适当的修改,则得到的结果如图 6-44所示。
第三章 matlab 提高 计算机仿真与模拟
surf函数具体的使用请参阅 MATLAB的帮助文档或者函数的在线帮助。其他的三维曲线、曲面绘制函数就不再赘述了。
最后给出一个三维曲面的绘制示例,这里主要使用了 waterfall
函数,contour3函数和前面介绍过的 plot3函数。若对例子 6-17
使用的函数有所疑问,请参阅 MATLAB的帮助文档。
第三章 matlab 提高 计算机仿真与模拟图 6-44 surf函数使用示例第三章 matlab 提高 计算机仿真与模拟例子 6-17 其他三维绘图函数示例。
例子 6-17的脚本文件代码如下:
001 %SURF_3D 三维绘图函数示例
002 % 准备数据
003 x =?3:0.3:3; y = x;
004 [X,Y]=meshgrid(x,y);
005 [theat,R] = cart2pol(X,Y);
006 Z = sinc(R);
007 % 等高线
008 subplot(2,2,1)
009 contourf(peaks(30),10)
第三章 matlab 提高 计算机仿真与模拟
010 colorbar
011 grid on
012 title('Peaks Function - (CONTOURF & COLORBAR)')
013 % plot3函数绘制矩阵数据
014 subplot(2,2,2)
015 plot3(X,Y,Z)
016 grid on
017 axis([-3 3 -3 3 -1 1])
018 title('Sinc Function - (PLOT3)')
019 % waterfall函数,效果类似 surfz函数
020 subplot(2,2,3)
第三章 matlab 提高 计算机仿真与模拟
021 waterfall(membrane(1));
022 title('L-shaped Membrane - (WATERFALL)')
023 %三维等高线
024 subplot(2,2,4)
025 contour3(peaks(30),25);
026 title('Peaks Function - (CONTOUR3)')
027 colormap hsv
第三章 matlab 提高 计算机仿真与模拟图 6-45 三维绘图函数的应用示例第三章 matlab 提高 计算机仿真与模拟
6.6 保存和输出图形
6.6.1 保存和打开图形文件
MATLAB支持将图形文件保存成为二进制格式的文件 。 为此,MATLAB提供了一种类似于 MAT格式的文件用来保存
MATLAB的图形文件,这种文件的扩展名为 *.fig。 这种二进制的图形格式文件只能够在 MATLAB中使用 。
若需要将文件保存成为 fig格式的图形文件,则在图形窗体中选择,File”菜单下的,Save”命令,或者直接单击工具栏上的保存按钮,在弹出的对话框中选择保存类型为,fig,如图 6-46所示。
第三章 matlab 提高 计算机仿真与模拟在对话框中给定文件名称,然后单击,保存,按钮就可以保存文件了 。
打开文件的过程和保存文件的过程类似,都可以通过菜单命令或者工具栏的按钮完成操作 。
不过,MATLAB独具特色的就是为保存的图形文件提供了相应的命令,这个命令就是 saveas,该命令的一般语法结构如下:
saveas(h,'filename.ext');
saveas(h,'filneame','format');
第三章 matlab 提高 计算机仿真与模拟图 6-46 保存图形文件的对话框第三章 matlab 提高 计算机仿真与模拟其中,h为图形的句柄,例如可以直接使用 gcf指令获取当前的图形窗口的句柄; filename为保存的文件名,而 saveas命令根据 ext的不同将文件存成为不同的格式 。 在第二种命令行格式中,format直接说明文件的保存格式,它可以是图形文件的扩展名,或者是 m,或者 mfig,在取 m或者 mfig的时候,文件将被保存成为一个可调用的 M文件和相应的图形数据文件 。
打开图形文件就只要用 open命令就可以了,open函数会根据文件的扩展名不同而调用相应的辅助函数文件。例如在打开,fig图形文件时,调用 open命令,具体过程请参阅例子 6-18。
第三章 matlab 提高 计算机仿真与模拟例子 6-18 在命令行中保存打开图形文件 。
在 MATLAB命令行窗口中,键入下面的指令:
>> surf(peaks(30))
>> % 将图形文件保存为 M文件和 fig文件
>> saveas(gcf,'peakfile','M')
>> % 调用 M文件重新显示窗体
>> peakfile
>> % 使用 open指令打开文件
>> open('peakfile.fig')
第三章 matlab 提高 计算机仿真与模拟在上面的短短几行代码中,代码将图形文件保存成为了一个 M文件和一个 fig文件,其中 M文件的主要内容是:
001 function h = peakfile
002 [path,name] = fileparts(which(mfilename));
003 figname = fullfile(path,[name '.fig']);
004 if (exist(figname,'file')),open(figname),else
open([name '.fig']),end
005 if nargout > 0,h = gcf; end
在文件中,不可缺少的就是大量的注释信息,而 M文件的代码主要保证了可靠地打开保存的图形文件。最后的 open命令能够完成同样的功能。
第三章 matlab 提高 计算机仿真与模拟
6.6.2 导出文件尽管保存,fig文件非常方便,但是,fig文件却只能够在
MATLAB中使用,所以 MATLAB的图形窗口还可以将图形文件保存成其他的特殊图形格式文件。在表 6-3中列举了能够直接在图形窗体中导出的图形文件类型。
第三章 matlab 提高 计算机仿真与模拟表 6-3 MATLAB支持的图形文件格式文件类型 扩展名 文件类型 扩展名增强型图元文件 e m f T IF F 图形文件 tif
位图 bm p T IF F 格式非压缩文件 tif
E P S 文件 e ps 便携式网络图像格式 png
E P S 色彩文件 e ps 24 位位图文件 pc x
E P S 二级文件 e ps 便携式位图 pbm
E P S 二级色彩文件 e ps 便携式灰度图 pgm
A dob e Il lus tr a tor 文件 ai 便携式像素图 ppm
JP E G 图形文件 jpg
第三章 matlab 提高 计算机仿真与模拟若需要将图形文件保存成表 6-3列举的各种类型文件,需要执行图形窗体,File”菜单下的,Export”命令,然后在对话框中选择需要导出的图形文件格式,最后给出相应的文件名,
单击“保存”按钮后完成操作,对话框如图 6-47所示。
第三章 matlab 提高 计算机仿真与模拟图 6-47 导出文件对话框第三章 matlab 提高 计算机仿真与模拟在前面小节介绍的 saveas指令中,也可以使用这些扩展名来保存图形文件 。 例如将图形文件保存成为 tiff格式的文件,命令行为
saveas(h,filename,'tif');
MATLAB提供了另外一个功能强大的命令来保存图形文件,
这个命令就是 print命令 。
从直观上看,print命令的作用是将图形文件通过打印机输出,它也支持将图形文件保存成其他格式的图形文件或者数据文件,这些图形文件不仅仅是那些在表 6-3中列出的图形文件,
而且还有更多的格式可以被支持,例如 PostScript格式的文件等。
第三章 matlab 提高 计算机仿真与模拟
MATLAB还提供了一个名为 printopt的 M文件,该文件主要可以由系统管理员编辑,以指明缺省的打印机类型和打印目标,当调用它时,返回缺省值的打印命令和设备选项,例如在
Windows系统下执行该命令:
>> [pcmd,dev] = printopt
pcmd =
COPY /B $filename$ $portname$
dev =
-dwin
第三章 matlab 提高 计算机仿真与模拟
print命令的基本使用方法如下:
print -device -options filename
在命令行中,device 和 options的选取有很多选项,而
device可以是某种 MATLAB支持的打印驱动,也可以是某种图形文件格式 。 由于受篇幅的限制这里就不一一解释说明了,请读者参阅 MATLAB的帮助文档,doc print。
若将图形文件输出到打印机,则使用以下命令行:
这时 print命令就可以直接将图形文件输出到当前系统默认的打印机。
第三章 matlab 提高 计算机仿真与模拟将图形输出成为 PostScript文件,可以指定相应的设备,例如:
>> print -dps filename
可以将图形文件保存为黑白的 PS文件,而命令行:
>> print -dpsc filename
可以将图形文件保存为彩色的 PS文件。
第三章 matlab 提高 计算机仿真与模拟
6.6.3 拷贝图形文件在 Windows操作系统中,可以将图形窗体中的内容拷贝到剪贴板上,然后可以将剪贴板上的内容拷贝到任何一个
Windows应用程序中。拷贝图形时,不是简简单单地按下快捷键 Ctrl+C就可以了,而是需要通过图形窗体,Edit”菜单下的
,Copy Figure”命令来完成,如图 6-48所示。
第三章 matlab 提高 计算机仿真与模拟图 6-48 拷贝图形的菜单命令第三章 matlab 提高 计算机仿真与模拟这时拷贝下来的图形粘贴出来的效果类似前面章节图 6-24
的效果。可以通过选择,MATLAB”菜单下的,Reference”命令,
在弹出的对话框中对控制拷贝图形效果的选项参数进行设置,
如图 6-49所示。
第三章 matlab 提高 计算机仿真与模拟图 6-49 设置拷贝图形的模板第三章 matlab 提高 计算机仿真与模拟
MATLAB提供了两种 Windows应用程序的拷贝模板 ——
Word和 PowerPoint,用户可以在如图 6-49所示的对话框中设置相应的模板选项,而更加精细的设置需要在拷贝选项对话框中进行 。
在如图 6-50所示的对话框中可以设置精细的拷贝选项,比如剪贴板的选项以及背景图的设置等。当拷贝图形效果不甚理想的时候,可以通过修改这些设置来达到满意的效果。
第三章 matlab 提高 计算机仿真与模拟图 6-50 拷贝选项对话框第三章 matlab 提高 计算机仿真与模拟
6.7 数据插值和曲线拟合
6.7.1 插值运算一般地,从各种试验得来的数据总是有一定的数量,而利用插值技术能够从有限的数据中获取系统整体的状态,因此,
数据插值在各行各业,特别是信号处理领域内有着广泛的应用。
MATLAB软件作为数据处理的优秀软件之一,自然提供了常用的各种数据插值计算的函数。在本小节,主要介绍由 MATLAB
基本模块提供的插值计算函数。
第三章 matlab 提高 计算机仿真与模拟表 6-4 插值计算函数函数 说明
in te rp 1 一维插值 ( 数值查表 )
in te rp 1q 一维快速插值 ( 数值查表 )
in te rp 2 二维插值 ( 数值查表 )
in te rp 3 三维插值 ( 数值查表 )
in te r p n N 维插值 ( 数值查表 )
in te rp ft 使用 FFT 算法的一维插值
gr id da ta 二维数据网格的表面数据插值
gr id da ta 3 三维数据网格的超表面 (h yp e rsu rfa c e ) 数据插值
gr id da ta n 多维数据网格的超表面数据插值
m kp p 产生分段多项式
pc hi p 分段的厄密多项式
ppv al 计算分段多项式的数值
sp lin e 三次杨条插值
un m kp p 分段多项式的细节第三章 matlab 提高 计算机仿真与模拟在表 6-4的函数中较常用的就是进行基本插值的 interp系列函数,其中 interp1和 interp1q函数比较起来,后者在处理 X为单调递增的向量,Y为列向量或者行数同 X向量长度的矩阵进行插值计算的时候,速度较快,而且仅能进行线性插值 。
interp1函数一般的用法为
yi = interp1(x,y,xi,method)
其中:
* x和 y为原始数据 。
* xi为需要计算的插值点。
第三章 matlab 提高 计算机仿真与模拟
* method可以为插值计算指定相应的算法,为字符串类型,
其取值可以为 nearest,linear,spline,cubic,pchip,v5cubic。
在 interp系列函数中 method参数使用的几种不同的取值分别对应了不同的插值计算方法,例如 linear为线性插值算法,
它也是系统默认的插值算法,而 spline为三次杨条插值算法 。
有关插值算法请参阅相应的数值分析教科书,对于更高次的插值算法函数,请参阅 MATLAB的帮助文档 。
第三章 matlab 提高 计算机仿真与模拟若进行插值运算时,xi的取值超过了 x的范围,则需要进行外插运算,这个时候需要在使用函数的时候指定参数 extrap,
即函数的使用方法为
yi = interp1(x,y,xi,method,'extrap');
第三章 matlab 提高 计算机仿真与模拟例子 6-19 一维插值函数示例。
例子 6-19使用的脚本文件如下:
001 %INTERP_EX1 一维插值计算示例
002 % 准备数据
003 x = 0:10;
004 y = cos(x);
005 % 插值点
006 xi = 0:0.2:10;
007 % 进行插值运算
008 yin = interp1(x,y,xi,'nearest');
009 yic = interp1(x,y,xi,'cubic');
010 % 绘制结果
011plot(x,y,'o',xi,yin,'*',xi,yic)
012 legend('origin','nearest','cubic')
013 title('一维插值计算示例 ')
第三章 matlab 提高 计算机仿真与模拟运行脚本文件得到的结果如图 6-51所示 。 在例子 6-19的代码中,使用了两种一维插值算法,分别为 nearest和 cubic,由于 nearest算法仅计算插值点左近的数值,所以从结果上看插值得到的结果很不理想,而三次插值计算得到的结果相对要理想得多 。
不过从计算时间和内存等系统资源的损耗上考虑,nearest
是最快的而又最节省资源的一种算法,而三次插值或者样条插值运算则需要消耗较多的系统资源,所以请用户根据需要选择合适的插值算法。
第三章 matlab 提高 计算机仿真与模拟二维插值运算函数的使用方法类似一维插值运算函数的使用方法,同样也可以在使用函数的同时指定相应的算法:
nearest,linear,cubic和 spline等。与一维插值不同的是,这里使用的插值算法都需要进行双次运算,所以也可以在算法选择时使用 bilinear或者 bicubic关键字指定相应的算法。在例子 6-
20中,对这几种插值算法进行了比较。
第三章 matlab 提高 计算机仿真与模拟图 6-51 一维插值计算示例
0 1 2 3 4 5 6 7 8 9 10
一维插值
o r i g i n
n e a r e s t
c u b i c
-1
- 0,8
- 0,6
- 0,4
- 0,2
0
0,2
0,4
0,6
0,8
1
第三章 matlab 提高 计算机仿真与模拟例子 6-20 二维插值运算算法比较。
001 function compare_interp( )
002 %COMPARE_INTERP 不同插值运算的比较
003
004 % 原始数据
005 [x,y] = meshgrid(?3:1:3);
006 z = peaks(x,y);
007 figure(1); clf
008 surfc(x,y,z);
009 title('原始数据 ')
010 % 进行插值运算第三章 matlab 提高 计算机仿真与模拟
011 [xi,yi] = meshgrid(?3:0.25:3);
012 zi1 = interp2(x,y,z,xi,yi,'nearest');
013 zi2 = interp2(x,y,z,xi,yi,'linear');
014 zi3 = interp2(x,y,z,xi,yi,'cubic');
015 zi4 = interp2(x,y,z,xi,yi,'spline');
016 % 通过可视化结果比较
017 figure(2)
018 subplot(2,2,1);surf(xi,yi,zi1);
019 title('二维插值 - ''nearest''')
020 subplot(2,2,2);surf(xi,yi,zi2);
021 title('二维插值 - ''linear''')
022 subplot(2,2,3);surf(xi,yi,zi3)
第三章 matlab 提高 计算机仿真与模拟
023 title('二维插值 - ''cubic''')
024 subplot(2,2,4);surf(xi,yi,zi4)
025 title('二维插值 - ''spline''')
026 % 可视化结果
027 figure(3)
028 subplot(2,2,1);contour(xi,yi,zi1)
029 title('二维插值 - ''nearest''')
030 subplot(2,2,2);contour(xi,yi,zi2)
031 title('二维插值 - ''linear''')
032 subplot(2,2,3);contour(xi,yi,zi3)
033 title('二维插值 - ''cubic''')
034 subplot(2,2,4);contour(xi,yi,zi4)
035 title('二维插值 - ''spline'''')
第三章 matlab 提高 计算机仿真与模拟图 6-52 例 6-20的结果图
(a) 原始数据的曲面图
-4
-2
0
2
4
-4
-2
0
2
4
-6
-4
-2
0
2
4
6
原始数据第三章 matlab 提高 计算机仿真与模拟图 6-52 例 6-20的结果图
(b) 插值数据结果图 —— surf
-5
0
5
-5
0
5
- 1 0
0
10
二维插值 - 'n e a r e s t '
-5
0
5
-5
0
5
- 1 0
0
10
二维插值 - 'l i n e a r '
-5
0
5
-5
0
5
- 1 0
0
10
二维插值 - 'c u b i c '
-5
0
5
-5
0
5
- 1 0
0
10
二维插值 - 's p l i n e '
第三章 matlab 提高 计算机仿真与模拟图 6-52 例 6-20的结果图
(c) 插值运算结果图 —— contour
-2 0 2
-3
-2
-1
0
1
2
3
二维插值 - 'n e a r e s t '
-2 0 2
-3
-2
-1
0
1
2
3
二维插值 - 'l i n e a r '
-2 0 2
-3
-2
-1
0
1
2
3
二维插值 - 'c u b i c '
-2 0 2
-3
-2
-1
0
1
2
3
二维插值 - 's p l i n e '
第三章 matlab 提高 计算机仿真与模拟若在执行例子 6-20的代码时,打开性能分析器,则可以看到 012~ 014行代码占用的计算时间,下面为分析文件的片段:
......
0.060 1 x 12 zi1 = interp2(x,y,z,xi,yi,'nearest');
0.030 1 x 13 zi2 = interp2(x,y,z,xi,yi,'linear');
0.051 1 x 14 zi3 = interp2(x,y,z,xi,yi,'cubic');
0.100 1 x 15 zi4 = interp2(x,y,z,xi,yi,'spline');
.....,
第三章 matlab 提高 计算机仿真与模拟通过例子 6-20的运算结果可以看出,不同的插值算法在运算结果和运算消耗时间上的差别 。 用户同样需要根据自己的需要选择不同的算法 。
有关数据插值的应用还有很多内容,受篇幅的限制这里就不再一一详细介绍。有兴趣的读者可以通过学习有关数值分析的知识,同时了解和掌握不同的 MATLAB数据插值函数。
第三章 matlab 提高 计算机仿真与模拟
6.7.2 曲线拟合曲线拟合的任务和数据插值的任务不同,曲线拟合需要从一些离散的数据中推导出两者之间的数学解析关系,而数据插值是通过原始数据计算一些新的离散数据点 。 曲线拟合的结果一般为一个或者多个数学解析关系,利用这些解析关系能够对数据进行一定的推断,准确的曲线拟合结果可以用来进一步评估,验证实测的数据 。 在本小节将介绍利用 MATLAB的基本模块进行曲线拟合的函数和方法,而 MATLAB高级的曲线拟合应用请参阅 MATLAB 和 Curve Fitting工具箱的帮助文档 。
利用 MATLAB进行曲线拟合主要有两种方法:回归法拟合和多项式拟合,本小节通过一些具体的示例来说明这两种不同的曲线拟合方法。
第三章 matlab 提高 计算机仿真与模拟例子 6-21 回归法曲线拟合 。
回归法主要使用 MATLAB的左除运算来寻找曲线拟合解析函数的系数 。 例如有这样一组数据:
>> t = [0,3,8 1.1 1.6 2.3]';
>> y = [0.5 0.82 1.14 1.25 1.35 1.40]';
将这组数据绘制出来:
>> plot(t,y,'r*')
>> grid on
得到如图 6-53所示的图形结果。
第三章 matlab 提高 计算机仿真与模拟图 6-53 进行拟合计算的原始数据
0 0,5 1 1,5 2 2,5
0,5
0,6
0,7
0,8
0,9
1
1,1
1,2
1,3
1,4
第三章 matlab 提高 计算机仿真与模拟通过图 6-53的分布情况,可以猜测该数据由如下的表达式得出:
进行曲线拟合的任务就是分别求得表达式中的三个系数,
这样就可以得到相应的等式关系:
Y=AT
若需要求得 A则只要计算除法:
A=Y/T
2210 tataay
第三章 matlab 提高 计算机仿真与模拟于是,在 MATLAB中键入下面的指令,就可以得到计算的结果:
>> X = [ones(size(t)) t t.^2]
X =
1.0000 0 0
1.0000 0.3000 0.0900
1.0000 0.8000 0.6400
1.0000 1.1000 1.2100
1.0000 1.6000 2.5600
1.0000 2.3000 5.2900
>> A = X\y
A =
0.5318
0.9191
-0.2387
第三章 matlab 提高 计算机仿真与模拟这样得到的多项式应该为
y=0.5318+0.9191t-0.2387t2
为了验证结果,可以进一步进行计算:
>> T = (0:0.1:2.5)';
>> Y = [ones(size(T)) T T.^2]*A;
>> plot(T,Y,'-',t,y,'o'),grid on
>> legend('Fitting','Origin')
这时得到的图形结果如图 6-54所示。
第三章 matlab 提高 计算机仿真与模拟图 6-54 拟合结果与原始数据的比较
0 0,5 1 1,5 2 2,5
0,5
0,6
0,7
0,8
0,9
1
1,1
1,2
1,3
1,4
1,5
F i t t i n g
O r i g i n
第三章 matlab 提高 计算机仿真与模拟除了多项式以外,还可以猜测原始数据的多项式是由指数函数组成的:
tt teaeaay 210
于是,为了求得系数,可以在 MATLAB的命令行中键入下面的指令:
>> X = [ones(size(t)) exp(-t) t.*exp(-t)]
X =
1.0000 1.0000 0
1.0000 0.7408 0.2222
1.0000 0.4493 0.3595
1.0000 0.3329 0.3662
第三章 matlab 提高 计算机仿真与模拟
1.0000 0.2019 0.3230
1.0000 0.1003 0.2306
左除:
>> A = X\y
A =
1.3974
-0.8988
0.4097
这样得到的多项式应该为
tt teey 4 0 9 7.08 9 8 8.03 9 7 4.1
第三章 matlab 提高 计算机仿真与模拟为了验证这次得到的结果,可以进一步计算:
>> T = (0:0.1:2.5)';
>> Y = [ones(size(T)) exp(-T) T.*exp(-T)]*A;
>> plot(T,Y,'-',t,y,'o'),grid on
>> legend('Fitting','Origin')
这时得到的曲线图形如图 6-55所示。
第三章 matlab 提高 计算机仿真与模拟图 6-55 曲线拟合结果和原始数据比较
0 0,5 1 1,5 2 2,5
0,4
0,6
0,8
1
1,2
1,4
1,6
F i t t i n g
O r i g i n
第三章 matlab 提高 计算机仿真与模拟可以看出,在两次的曲线拟合结果中,利用指数函数拟合的结果比较好 。
另外一种曲线拟合的方法是多项式拟合 。 在 MATLAB中,
进行多项式拟合主要使用两个函数,polyfit和 polyval。
polyfit函数主要用来进行拟合计算,它的基本语法为
p = polyfit(x,y,n)
其中,x和 y为参与曲线拟合计算的原始数据,n为进行拟合计算的多项式次数,函数的返回值是多项式的系数,也就是说,
函数的运算结果为多项式的系数向量。
第三章 matlab 提高 计算机仿真与模拟
0111,,,pxpxpxpy nnnn
polyval函数主要用来计算多项式的数值,它的基本语法为
y = polyval(p,x)
其中,p为多项式的系数,而 x是变量的数值,得到的结果就是函数的数值向量 。
第三章 matlab 提高 计算机仿真与模拟例子 6-22 polyfit函数和 polyval函数的应用示例。
下面是例子 6-22的脚本文件:
001 %CURVE_FIT 多项式拟合计算示例
002 % 准备原始数据
003 x = 0:.1:10;
004 y = sin(x)+cos(2*x);
005 % 5次多项式拟合
006 k5 = polyfit(x,y,5);
007 y5 = polyval(k5,x);
008 % 11次多项式拟合
009 k11 = polyfit(x,y,11);
010 y11 = polyval(k11,x);
第三章 matlab 提高 计算机仿真与模拟
011 % 绘制数据曲线
012 plot(x,y,'g',x,y5,'r',x,y11,'b')
013 % 标注
014 title('Curve Fitting','Fontsize',14)
015 legend('Original Curve','5th order','11th order',4 )
016 set(findobj('Type','line'),'LineWidth',2)
第三章 matlab 提高 计算机仿真与模拟运行例子 6-22的代码:
>> curve_fit
Warning,Polynomial is badly conditioned,Remove repeated data
points
or try centering and scaling as described in HELP POLYFIT.
(Type "warning off MATLAB:polyfit:RepeatedPointsOrRescale" to
suppress this warning.)
> In E:\MATLAB6p5\toolbox\matlab\polyfun\polyfit.m at line 75
In D:\Temp\Ch6\curve_fit.m at line 9
第三章 matlab 提高 计算机仿真与模拟出现上述警告信息的原因是使用了过高的数据拟合阶数 。
由于 polyfit函数是通过左除算法获取多项式系数的,如果此时矩阵接近奇异 (不可逆 ),但又需要对该矩阵进行求逆计算时,
则会出现上述的警告信息 。
例子 6-22运行的图形结果如图 6-56所示。
第三章 matlab 提高 计算机仿真与模拟图 6-56 曲线拟合的图形结果
0 1 2 3 4 5 6 7 8 9 10
Cu r v e Fi t t i n g
O r i g i n al C u r v e
5 t h o r d e r
1 1 t h o r d e r
-2
- 1,5
-1
- 0,5
0
0,5
1
1,5
第三章 matlab 提高 计算机仿真与模拟
6.7.3 基本拟合工具为了便于进行曲线拟合计算,MATLAB提供了基本的曲线拟合工具界面,利用这个图形界面,可以方便地实现常用的曲线拟合工作,利用该界面可以完成下列工作:
* 使用三次样条曲线 (cubic spline)或最高 10阶的多项式拟合数据 。
* 对一组给定的数据同时绘制多条拟合曲线 。
* 绘制拟合残差曲线 。
* 查看拟合的数值结果 。
* 对拟合曲线求值 (内插或外推 )。
* 用拟合数值结果和残差的范数标注图形 。
* 把拟合的结果保存到 MATLAB工作区。
第三章 matlab 提高 计算机仿真与模拟例子 6-23 使用基本曲线拟合工具 。
进行曲线拟合工作的第一步是加载原始数据,在本例子中,
使用的数据来自于 MATLAB自带的 Demo,关于该 MATLAB自带例子的信息请参阅在线帮助,help census。
在 MATLAB命令行窗口中键入下面的指令:
>> load census
>> plot(cdate,pop,'ro');
绘制出原始数据后,执行图形窗体,Tools”菜单下的
,Basic Fitting”命令,这时将弹出基本曲线拟合工具的图形用户界面,如图 6-57所示。
第三章 matlab 提高 计算机仿真与模拟在弹出的对话框中,首先选择需要进行曲线拟合的数据,
在,Select data”的下拉列表框中,选择,data1”,即当前进行曲线拟合运算的数据。若坐标轴上有多条数据时,则可以选择不同的曲线拟合原始数据。
第三章 matlab 提高 计算机仿真与模拟图 6-57 基本曲线拟合工具界面第三章 matlab 提高 计算机仿真与模拟然后选择一个合适的拟合算法。在基本曲线拟合算法列表框中,选择,cubic”复选框,这时将使用三次多项式进行曲线拟合计算。选择,Show equations”复选框,则系统将曲线拟合的多项式绘制在图形中。另外,还可以通过选择不同的复选框,
在图形窗体中输出曲线拟合的残差,以及残差的范数等,这时的曲线拟合工具界面如图 6-58所示。
第三章 matlab 提高 计算机仿真与模拟图 6-58 设置曲线拟合的属性第三章 matlab 提高 计算机仿真与模拟在选择曲线拟合算法的时候,系统有时候会给出如图 6-59
所示的对话框提示 。
该信息在前面利用函数进行多项式计算的时候已经有所提示,为了解决该问题,需要选择,Center and Scale X data”
复选框。在选择不同的曲线拟合属性的同时,系统将不断地将曲线拟合结果输出在图形窗体中,在完成了上述操作步骤之后,曲线图形窗体的结果如图 6-60所示。
第三章 matlab 提高 计算机仿真与模拟图 6-59 基本拟合计算的提示信息第三章 matlab 提高 计算机仿真与模拟图 6-60 曲线拟合的结果绘制在图形窗体中
1 8 0 0 1 8 2 0 1 8 4 0 1 8 6 0 1 8 8 0 1 9 0 0 1 9 2 0 1 9 4 0 1 9 6 0 1 9 8 0
r es i d u al s
C u b i c,n o r m o f r es i d u al s = 1 2,2 3 8
1 7 5 0 1 8 0 0 1 8 5 0 1 9 0 0 1 9 5 0 2 0 0 0
y = 0,9 2 * x
3
+ 2 5 * x
2
+ 7 4 * x + 6 2
d at a 1
cu b i c
0
1 0 0
2 0 0
3 0 0
-5
0
5
第三章 matlab 提高 计算机仿真与模拟此时图形窗体中的注释是由系统自动添加的,可以使用图形编辑器修改其中的内容 。 单击基本曲线拟合工具的按钮,
可以得到基本曲线拟合工具的扩展,在这部分扩展的工具界面中,可以查看曲线拟合计算的结果,包括多项式的系数和范数等,如图 6-61所示 。
第三章 matlab 提高 计算机仿真与模拟图 6-61 基本曲线拟合工具的界面扩展第三章 matlab 提高 计算机仿真与模拟在扩展界面中,单击,Save to workspace”按钮可以将曲线拟合计算得到的结果保存到工作空间中,如图 6-62所示。
图 6-62 将曲线拟合的结果保存到工作空间第三章 matlab 提高 计算机仿真与模拟这时保存的结果为一个结构,按下,OK”按钮之后在
MATLAB命令行窗口中输入下列指令进行查看:
Basic Fitting GUI created variables in the current workspace.
>> whos
Name Size Bytes Class
cdate 21x1 168 double array
fit1 1x1 318 struct array
normresid1 1x1 8 double array
pop 21x1 168 double array
Grand total is 68 elements using 662 bytes
第三章 matlab 提高 计算机仿真与模拟
>> fit1
fit1 =
type,'polynomial degree 3'
coeff,[0.9210 25.1834 73.8598 61.7444]
在工作空间中的变量包含了曲线拟合的多项式系数结果 。
利用该结果可以通过 polyval函数进一步计算多项式的数值 。
若再次单击基本曲线拟合界面上的按钮,则能够得到再次扩展的工具界面,在该界面中可以计算一下当前拟合多项式的数值,如图 6-63所示。
第三章 matlab 提高 计算机仿真与模拟图 6-63 进一步扩展基本曲线拟合界面第三章 matlab 提高 计算机仿真与模拟在本例子中,进一步计算了 2000年至 2040年之间的人口数量的变化,间隔为 10年。通过选择,Plot evaluated results”复选框,可以将这些拟合计算的结果也绘制在图形界面中,如图 6-
64所示。
第三章 matlab 提高 计算机仿真与模拟图 6-64 曲线拟合运算的结果
1750 1800 1850 1900 1950 2000 2050
y = 0,9 2 * x
3
+ 2 5 * x
2
+ 7 4 * x + 6 2
d a t a 1
c u b i c
Y = f ( X )
0
50
100
150
200
250
300
350
400
450
第三章 matlab 提高 计算机仿真与模拟如果选择,Save to workspace”按钮,还可以将结果保存在工作空间中 。
通过例子 6-23的学习,读者应该已经基本掌握了基本曲线拟合工具的使用方法。更高级的曲线拟合工作可以使用
MATLAB的曲线拟合工具箱来完成。不过有关曲线拟合工具箱方面的知识已经超出了本书的讨论范围,有兴趣的读者请参阅 MATLAB的帮助文档。
第三章 matlab 提高 计算机仿真与模拟6.8 本 章 小 节在本章详细介绍了 MATLAB的基本图形和数据可视化的能力。 MATLAB的图形和数据可视化是其强大功能的一个重要表现,这其中包括了灵活的二维和三维数据可视化、各种图形标注和特殊图形的绘制能力,另外 MATLAB还提供了丰富的导入、
导出数据图形的能力。 MATLAB不仅能够将图形绘制出来,而且还具有完成一定的数据分析的能力,在本章介绍了数据插值和曲线拟合的方法。通过本章的学习,读者应该能够掌握基本的数据可视化和绘图函数的使用,同时能够完成简要的数据统计分析的工作。除了利用 MATLAB本身的数据分析功能以外,
还可以利用 Curve Fitting 工具箱完成复杂的曲线拟合工作,使用
Statistics工具箱进行高级数据统计工作。数据可视化和分析是科学计算、信号处理、控制系统应用等领域的重要内容,掌握本章的内容可以为这些领域内的高级应用打下坚实的基础。