常见编程错误
每一行元素的个数必须完全相同,每一列元素的个数也必须完全相同.试图创建一个不同行(列)拥有不同数目元素的数组,在编译时将会出现错误.
用于初始化数组的表达式可以包括代数符号或事先已经定义好的数组.例如赋值语句 a=[0 1+7] b=[a(2) 7 a] 定义了数组a=[0 8]和数组b=[8 7 0 8]. 当我们创建一个数组时,不是每一个元素都必须定义.如果要定义一个特殊的数组,或只有一个或几个元素没有定义,那么之前的那些元素将会自动创建,并初始化为0.例如,如果数组c事先没有定义,语句c(2,3)=5将会创建一矩阵c???000?。相似地,指定一个值赋予??005?一个存在的数组,但超过了这个数组的大小。例如,假设存在一数组d=[1 2],下面这个语句 d(4)=4; 将会制造出数组d=[1 2 0 4]. 在每个赋值语句末的分号有特殊的目的:无论在何时一个表达式在赋值语句中被赋值,分号将会中止变量值的重复。如果句末没有分号,变量值将会自动显示在命令窗口(The Command Windows)中。 >> e=[1 2 3;4 5 6] e = 1 2 3 4 5 6 如果在赋值语句末有分号,这种重复将会消失。重复是一个用于检查你的工作极好的方法,但是它降低了运行速度。因此,我们在一般情况下总是禁止重复。尽管如此,重复计算的结果提供了一个强大的应急调试器。如果你不能确定一个特定的赋值语句结果是多少,这时你可以去掉这个语句后的分号,当这个语句编译时,结果会显示在命令窗口(The Command Windows)。
好的编程习惯
在MATLAB赋值语句后加上一个分号来禁止变量值在命令窗口(The Command Windows)的重复。这将大大提高编译的速度。
好的编程习惯
如果你在调试程序时需要检测一个语句的结果,可能把句后的分号去掉,这样结果将会出现在命令窗口(The Command Windows)。
2.2.2 用捷径表达式(short expressions)来赋值
创建一个小数组用一一列举出元素的方法是比较容易的,但是当我们创建包括成千上万个元素的数组怎么办?把每一个元素列举出来则不太现实。
MATLAB提供一种专门的捷径标记法,这种方法用克隆运算符(colon operator)适用于上述情况。克隆运算符指定一系列的数值,它指定了这个系列数的第一值,步增和最后一个值。它的一般顺序始下
first:incr:last
first代表数组的每一个值,incr代表步增量,last代表这个数组的最后一个值。如果步增量为1,那么步增量可省略,而变成了first:last格式。
例如,表达式1:2:10是创建一个1×5行向量[1 3 5 7 9]的简便方法。 >> x=1:2:10 x = 1 3 5 7 9
4
用克隆标记法初始化一个含有一百个元素的数组???2??,,?,??,语句如下 ?100100?Angles=(.01:.01:1)*pi 捷径表达式可以联合转置运算符(’)来初始化行向量,或更加复杂的矩阵。转置运算符可以在需要的情况下完成行和列的转换。因为这个表达式 f=[1:4]'; ?1??2?产生一个4元素行向量[1 2 3 4],然后将其转换成4元素的列向量f????相似地,表
?3????4?达式 g=1:4; h=[g' g'] ?1?2将会创建一个矩阵h???3??41?2?? 3??4?2.2.3 用内置函数来初始化
数组也可以用MATLAB内置函数创始化。例如,函数zeros可以初始化任何大小的全为零的数组。用许多形式的zeros函数。如果这个函数的参数只是一个标量,那么MATLAB将会创建一个方阵,行数和列数均为这个参数。如果这个函数有两个标量参数,那么第一个参数代表行数,第二个参数代表列数。因为size函数所返回的一个数组的行数和列数,所以它可以联合zeros函数来创建一个相同大小零矩阵。下面是一些用到zeros函数的例子。 a=zeros(2); b=zeros(2,3); c=[1 2;3 4]; d=zeros(size(c)) 这些语句产生下列的数组 ?0a???0?1c???30? ?0?2? 4???0b???0?0d???000? ?00?0? 0??相似地,ones函数产生的数组包含的元素全为1,eye函数通常用来产生单位矩阵,只有对
角线的元素为1.其他元素为0.表2.1列出一些用于初始化变量的函数.
表2.1 用于创始化变量的MATLAB函数 函数 作用 zeros(n) 创建一个n×n零矩阵 zeros(n,m) 创建一个n×m零矩阵 zeros(size(arr)) 创建一个与数组arr的零矩阵 ones(n) 创建一个n×n元素全为1矩阵 ones(n,m) 创建一个n×m元素全为1矩阵 eye(n) 创建一个n×n的单位矩阵 eye(n,m) 创建一个n×m的单位矩阵 length(arr) 返回一个向量的长度或二维数组中最长的那一维的长度 size(arr) 返回指定数组的行数和列数
5
2.2.4用关键字input初始化变量
关键字input用来提示使用者和直接从键盘输入初始化变量.当脚本文件(Script files)时,它可以用来提示使用者输入.input函数在命令窗口(The Command Windows)显示提示语句,并等待用户输入一个值.例如,下面的赋值语句: my_val=input('enter an input value:') 当这个语句被编译时,MATLAB打印出字符串enter an input value:,然后等待用户回复.如果要只输入一个数,那么只需要直接键入,如果要输入一个数组,则必须带上中括号([]).不管怎样,当按下回车键时.在窗口输入的任何值都会被储入变量my_val.如果只按下回车键,那么这个变量就存储了一个空矩阵.
如果input函数中有字符's'做为它的第二个参数,输入的数据就被当字符串.因此,语句 in1=input('enter data:'); enter data:1.23 把数值1.23存储到in1中.而语句 in2=input('enter data:','s') enter data:123 把字符串1.23存储到in2中. 测试2.1
本测试提供了一个快速的检查方式,看你是否掌握了2.1和2.2的基本内容。如果你对本测试有疑问,你可以重读2.1和2.2,问你的老师,或和同学们一起讨论。在附录B中可以找到本测试的答案。
1.数组,矩阵,向量有什么区别? 2.回答关于下列矩阵的有关问题
?1.1?3.23.40.6??
C??0.61.1?0.63.1???5.50.0??1.30.6?(a)C的大小是多少? (b)C(2,3)的值是多少?
(c)列出值为0.6的元素的下标
3.确定下列数组的大小,通过whos或工作空间窗口(The workspace browser)检查你的答案。注意在本练习中后面的数组可能要用到前面数组的定义。
(a) u=[10 20*i 10+20] (b) v=[-1;20;3]
(c) w=[1 0 -9;2 -2 0;1 2 3] (d) x=[u' v] (e) y(3,3)=-7
(f) z=[zeros(4,1) ones(4,1) zeros(1,4)'] (g) v(4)=x(2,1)
4.w(2,1)的值是多少? 5.x(2,1)的值是多少? 6.y(2,1)的值是多少?
7.当语句(g)执行后,v(3)的值是多少?
2.3 多维数组
6
正如我们所看到的,MATLAB的数组可能是一维或多维的。一维的数组可以形象地看作一系列的数垂直地罗列起来,用一个下标就可以调用数组中的元素(如图a)。这样的数组适用于一个变量的函数,例如在规定的时间间隔后一系列的测量温度。
row1 row1 row1 row1
a1(irow) (a)一维数组
row1 row1 row1 row1
col1 col2 col3 col4 col5 a2(irow,icol) (b)多维数组
许多数据的类型需要多变量的函数。例如,我要在5个不同的地方,每个地方测4次温度。在这种情况下,我们的20次测量结果在逻辑上分为五个不同的行,每行有4个测量结果(如图b).在这种情况下,我们就需要两个下标来调用这个数组特定的函数:第一个下标选择行,第二个下标选择列。这样的数组叫做二维数组。二维数组中元素的个数取决于这个数组的行数和列数。
出于问题的需要,MATLAB允许我们创建多维数组。这些数组的每一维对应一个下标,和每一个单个元素都可以通过它的每一个下标被调用。在这个数组中元素的总和取决于每一维中元素的个数。例如,下面两个语句创建了一个2×3×2数组c >> c(:,:,1)=[1,2,3;4,5,6]; >> c(:,:,2)=[7,8,9;10,11,12]; >> whos c Name Size Bytes Class c 2x3x2 96 double array Grand total is 12 elements using 96 bytes 这个数组(2×3×2)包括12种元素,它的内容显示方法和其他数组的显示方法大体相同 >> c c(:,:,1) = 1 2 3 4 5 6 c(:,:,2) = 7 8 9 10 11 12 2.3.1 多维数组在内存中的存储
一个有m行和n列的二维数组包括m×n个元素,这些元素在计算机的内存中将会占有m×n个连续的内存空间。这些数组的元素在内存中是如何排列的呢?MATLAB以列主导顺序分配数组中的元素。也就是说,内存先分配第一列的元素,然后第二列,第三列,??以此类推,直到所有列都被分配完。图2.3说明4×3数组a的内存分配情况。正如我们所看到的,元素a(1,2)是其实在内存分配的第五个位置。在下一节我们讨论用单一下标访问数
7
1 4 7 10 2 5 8 11 (a)
3 6 9 12 ... 1 4 7 10 2 5 8 11 3 6 9 12 ... a(1,1) a(2,1) a(3,1) a(4,1) a(1,2) a(2,2) a(3,2) a(4,2) a(1,3) a(2,3) a(3,3) a(4,3)
(b)
图2.3(a)数组a中的数据 (b)数据a在内在中的布局
组元素和第八章低级I/O接口,内存分配元素的顺序将变得十分重要。
这种分配方式也适用于多维数组。数组的第一个下标增长最快,第二个仅次之,依此类推,最后一个变化最慢。例如,在一个2×2×2数组中,它的元素在内存中的分配顺序是
(1,1,1),(2,1,1),(1,2,1),(2,2,1),(1,1,2),(2,1,2),(1,2,2),(2,2,2)。
2.3.1 用单个下标访问多标数组
MATLAB的特性之一就是它允许使用者或程序员把一个多维数看作一个一维数组,这个一维数组的长度等于多维数组的元素数。如果用一个下标访问一个多维数组,那么元素的排列顺序就是内存的分配顺序。
例如,假设我们要声明一个4×3的数组如下: >> a=[1 2 3 4 5 6 7 8 9 10 11 12] a = 1 2 3 4 5 6 7 8 9 10 11 12 那么a(5)的值为5和a(1,2)的值相同,这是因为元素a(1,2)排在内存第五个位置。 在一般情况下,我们不应使用MATLAB的这一特性。用单个下标访问多维数组可能会带很多的麻烦。
好的编程习惯
在访问多维数组时,总是使用合适的维数。
2.4 子数组
你可以选择和使用一个MATLAB函数的子集,好像他们是独立的数组一样。在数组名后面加括号,括号里面是所有要选择的元素的下标,这样就能选择这个函数的子集了。例如,
8
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库MatLab中文版(word版)第二章(2)在线全文阅读。
相关推荐: