假设定义了一个数组arr1如下 arr1=[1.1 -2.2 3.3 -4.4 5.5] 那么arr1(3)为3.3,arr1([1 4])为数组[1.1 -4.4],arr1(1:2:5)为数组[1.1 3.3 5.5]. 对于一个二维数组,克隆运算符可以用于下标来选择子数组。例如,假设 arr2=[1 2 3; -2 -3 -4;3 4 5] 将建立一个数组 23??1??arr2=?2?3?4 ???45??3?3??1??在这种定义下,子数组arr2(1,:)为[1 2 3],子数组arr2(:,1:2:3)为?2?4 ???5??3?
2.4.1 end函数
MATLAB中有一个特殊的函数叫做end函数,对于创建子数组的下标非常的有用.当用到
一个函数的下标时,end函数将会返回下标的最大值.
例如,假设数组arr3定义如下: arr3=[1 2 3 4 5 6 7 8]; 那么arr3(5:end)将会产生数组[5 6 7 8],arr3(end)将会产生值8. end函数返回的值一般为所要下标的最大值.如果end函数显示有不同的下标,那它将在一个表达式内返回不同的值.例如,假设一个3×4数组arr4的定义如下: arr4=[1 2 3 4;5 6 7 8;9 10 11 12] 那么表达式arr4(2:end,2:end)将会返回?返回值为4.
?678??.注意第一个end返回值为3,第二个
101112??2.4.2 子数组在左边的赋值语句的使用
只要数组的形(行数和列数)和子数组的形相匹配,把子数组放于赋值语句的左边用来
更新数组中的值。如果形不匹配,那么将会有错误产生。例如,下面有一个3×4数组定义如下: >> arr4=[1 2 3 4;5 6 7 8;9 10 11 12] arr4 = 1 2 3 4 5 6 7 8 9 10 11 12 因为在等号左边的表达式的形(2×2)与a相匹配,那么下面的这个赋值语句是合法的。 >> arr4(1:2,[1 4])=[20 21;22 23] arr4 = 20 2 3 21 22 6 7 23 9 10 11 12 注意数组元素(1,1),(1,4)(2,1)和(2,4)得到了更新。相对而言,两边的形不相匹配,则表达式是非法的,例如下面这个表达式。
9
>> arr5(1:2,[1 4])=[20 21] ??? Subscripted assignment dimension mismatch.
常见编程错误
对于涉及子数组的赋值语句,等号两边的形必须相匹配。否则将会产生错误。
在MATLAB中用子数组赋值和用值直接赋值有很大的不同。如果用子数组赋值,那么只有相应的值得到更新,而其他的值保持不变。另一方面,直接赋值,则数组的原有内容全部删除并被新的值替代。例如,假设用一个数组arr4定义如下: >> arr4=[1 2 3 4;5 6 7 8;9 10 11 12] arr4 = 1 2 3 4 5 6 7 8 9 10 11 12 下面的赋值语句,只更新特定的元素: >> arr4(1:2,[1 4])=[20 21;22 23] arr4 = 20 2 3 21 22 6 7 23 9 10 11 12 相对地,下面的赋值语句更新了数组的全部内容,并改变了数组的形 >> arr4=[20 21;22 23] arr4 = 20 21 22 23 好的编程习惯
确保将赋值于子数组和赋值于数组。MATLAB将它们当作两个不同的情况来对待。
2.4.3 用一标量来给子数组赋值
位于赋值语句的右边的标量值总是能匹配左边数组的形。这个标量值将会被复制到左边语句中所对应的元素。例如,假设用一个数组arr4定义如下: arr4=[1 2 3 4;5 6 7 8;9 10 11 12] 下面的表达式将一个值赋值于数组的4个元素。 >> arr4(1:2,1:2)=1 arr4 = 1 1 3 4 1 1 7 8 9 10 11 12 10
2.5 特殊变量
在MATLAB中有许多预先定义好的特殊变量。在MATLAB中这些特殊变量可以随时使用,不用初始化。一些常见的预定义值列在表2.2。 表2.2预定义特殊变量 pi 有15个有效值的π i,j 代表虚数i(?1) Inf 这个符号代表无穷大,它一般情况下是除以0产生的 NaN 这个符号代表没有这个数。它一般由数学运算得到的。例如,0除以0。 clock 这个特殊变量包含了当前的年,月,日,时,分,秒,是一个6元素行向量 date 当前的日期,使用的的字符形式,如30-Dec-2007 eps 变量名是epsilon的简写。它代表计算能机辨别的两数之间的最小数 ans 常用于存储表达式的结果,如果一个结果没有明确的赋值给某个变量 这个些预定义值存储在一般的变量中,所以他们能被覆盖或改写。如果一个新值赋值于其中一个预定义变量,,那么这以后的计算中新值将会替代默认值。例如,考虑下面用于计算以半径为10的圆的周长的语句; circl=2*pi*10 pi=3 circ2=2*pi*10 在第一个语句中,pi有默认值3.14159...,所以周长6.28319是正确的结果,第二个语句重定义pi为3,所以第三个语句circ2为60。在程序中修改预定义值会造成一些不正确的结果,并导致一些微小而难以发现的错误。设想一下,要在1000行的程序中找出一个像这样的错误是多么不容易。
常见编程错误
不要重定义有意义的预定义变量。否则将后患无穷,制造成出小而难以发现的错误。
测试2.2
本测试提供了一个快速的检查方式,看你是否掌握了2.3到2.5的基本内容。如果你对本测试有疑问,你可以重读2.3和2.5,问你的老师,或和同学们一起讨论。在附录B中可以找到本测试的答案。
1. c数组的定义如下,写出下面子数组的内容。 c =
1.1000 -3.2000 3.4000 0.6000 0.6000 1.1000 -0.6000 3.1000 1.3000 0.6000 5.5000 0
(a) c(2,:) (b) c(:,end) (c) c(1:2,2:end) (d) c(6) (e) c(4:end) (f) c(1:2,2:4) (g) c([1 4],2) (h) c([2 2],[3 3]) 2.当赋值语句执行后,下列数组的内容是多少? (a) a=[1 2 3; 4 5 6; 7 8 9]; a([3 1],:)=a([1 3],:); (b) a=[1 2 3; 4 5 6; 7 8 9]; a([1 3],:)=a([2 2],:); (c) a=[1 2 3; 4 5 6; 7 8 9]; a=a([2 2],:);
3.当数组执行后,下列数组a的内容是多少? (a) a=eye(3,3); b=[1 2 3]; a(2,:)=b;
11
(b) a=eye(3,3); b=[4 5 6 ]; a(:,3)=b'; (c) a=eye(3,3);
b=[7 8 9];
a(3,:)=b([3 1 2]); (d) a=eye(3,3);
b=[7 8 9];
a(3,:)=b([3 1 2]);
2.6 显示输出数据
在MATLAB中有许多的方法显示输出数据。最简单的方法是我们已经用过的去掉语句末的分号,它将显示在命令窗口(The Command Windows)中。在这里向大家介绍一些其他的方法。
2.6.1 改变默认格式
当数据重复在命令窗口(The Command Windows)时,整数以整形形式显示,其他值将以默认格式显示。MATLAB的默认格式是精确到小数点后四位。如果一个数太大或太小,那么将会以科学记数法的形式显示。比如,语句 x=100.11 y=1001.1 z=0.00010011 它的输入格式为 x = 100.1100 y = 1.0011e+003 z = 1.0011e-004 改变默认输出格式要用到format命令,可根据表2.3改变数据的输出格式 表2.3输出显示格式 format命令 结果 例子 format short 12.3457 保留小数点后4位(默认格式) format long 12.345678901234567 保留小数点后14位 format short e 1.2346e+00 带有5位有效数字科学记数法 format short g 总共有5个数字,可以用科学记数法,12.346 也可不用 format long e 1.234567890123457e+001 带有15位有效数字科学记数法 format long g 总共有5个数字,可以用科学记数法,12.3456789012346 也可不用 format bank 12.35 美元格式 format hex 4028b0fcd32f707a 用16进制表示 format rat 1000/81 两个小整数的比 format compact 隐藏多余的换行符 format loose 使用多余的换行符 format + + 只显示这个数的正负 所有例子都以12.345678901234567为例子默认的格式可以改变格式以显示更多的有效数字,用科学计数法来显示,精确到小数点后两位,显示或隐藏多余的换行符。
12
2.6.2 disp函数
另一种显示数据的方法是用disp函数。disp需要一个数组参数,它将值将显示在命令窗口(The Command Windows)中。如果这个数组是字符型(char),那么包含在这个数组中的字符串将会打印在命令窗口(The Command Windows)中。
此函数可联合num2str(将一个数转化为字符串)和int2str(将一个整数转化为字符串)来产生新的信息,显示在命令窗口(The Command Windows)中。例如,下面的语句将“the value of pi=3.1416”显示在命令窗口(The Command Windows)中。第一句创建了一个字符型数组,第二句用于显示这个数组。 str=['the value of pi=' num2str(pi)]; disp(str); 2.6.3 用fprintf函数格式化输出数据
用fprintf函数显示数据是一种十分简便方法。fprintf函数显示带有相关文本的一个或多个值,允许程序员控制显示数据的方式。它在命令窗口打印一个数据的一般格式如下:
fprint(format,data)
其中format用于代表一个描述打印数据方式的子符串,data代表要打印的一个或多个标量或数组。format包括两方面的内容,一方面是打印内容的文本的提示;另一方面是打印的格式。例如,函数 fprintf('The value of pi is %6.2f \\n',pi) 将会打印出'The value of pi is 3.14',后面带有一个换行符。转义序列%6.2代表在本函数中的第一个数据项将占有6个字符宽度,小数点后有2位小数。
fprintf函数有一个重大的局限性,只能显示复数的实部。当我们的计算结果是复数时,这个局限性将会产生错误。在这种情况下,最好用disp显示数据。
表2.4 fprintf函数format字符中的特殊字符 format string 结果 %d 把值作为整数来处理 %e 用科学记数法来显示数据 %f 用于格式化浮点数,并显示这个数 %g 用科学记数格式,或浮点数格式,根据那个短,并显示之 \\n 转到新的一行 例如,下列语句计算复数x的值,分别用fprintf和disp显示 x=2*(1-2*i)^3; str=['disp: x = ' num2str(x)]; disp(str); fprintf('fprintf: x = %8.4f\\n',x); 打印的结果如下 disp: x = -22+4i fprintf: x = -22.0000 注意frpintf忽略了虚部。
常见编程错误
fprintf函数只能复数的实部,所以在有复数参加或产生的计算中,可能产生错误的结果。
2.7 数据文件
有许多的方法用于加载和保存MATLAB的数据文件,这些方法将会在第八章中介绍。在这里我们只向大家介绍最简章的save和load命令。
13