当前位置:首页 > 4 第四章
end end average1 = (toc)/maxcount; % Calculate average time % Perform calculation with a preallocated array % \% loops. maxcount = 10; % One repetition tic; % Start timer for jj = 1:maxcount clear square % Clear output array square = zeros(1,10000); % Preinitialize array for ii = 1:10000 square(ii) = ii^2; % Calculate square end end average2 = (toc)/maxcount; % Calculate average time % Perform calculation with vectors. This calculation % averaged over 100 executions. maxcount = 100; % One repetition tic; % Start timer for jj = 1:maxcount clear square % Clear output array ii = 1:10000; % Set up vector square = ii.^2; % Calculate square end average3 = (toc)/maxcount; % Calculate average time % Display results fprintf('Loop / uninitialized array = %8.4f\\n', average1); fprintf('Loop / initialized array = %8.4f\\n', average2); fprintf('Vectorized = %8.4f\\n', average3); 4.2.2 break和continue语句
有两个附加语句可以控制while和for循环:break和continue语句。break语句可以中止循环的执行和跳到end后面的第一句执行,而continue只中止本次循环,然后返回循环的顶部。如果break语句在循环体中执行,那么体的执行中止,然后执行循环后的第一个可执行性语句。用在for循环中的break语句的例子如下:
程序执行的结果为: %test_break.m for ii = 1:5; if ii == 3; break; end fprintf('ii = %d \\n', ii); end disp('End of loop!'); >> test_break ii = 1 ii = 2 End of loop! 注意break语句在ii为3时执行,然后执行disp('End of loop!');语句而不执行fprintf('ii = %d \\n', ii);语句。
12
continue语句只中止本次循环,然后返回循环的顶部。在for循环中的控制变量将会更新到下一个值,循环将会继续进行。下面是一个在for循环中的continue的例子。 %test_continue.m for ii = 1:5; if ii == 3; continue; end fprintf('ii = %d \\n', ii); end disp('End of loop!'); 程序运行的结果为? >> test_continue ii = 1 ii = 2 ii = 4 ii = 5 End of loop! 注意continue语句在ii为3时执行,然后程序返回循环的顶部而不执行fprintf语句。break和continue语句可用在while循环和for循环中。
4.2.3 循环嵌套
一个循环完全出现在另一个循环当中,这种情况经常发生。如果一个循环完全出现在另一个循环当中,我们称这两个循环为带嵌套的循环。下面的例子用两重for循环嵌套来计算并写出结果。 for ii = 1:3 for jj = 1:3 product = ii * jj; fprintf('%d * %d = %d \\n',ii,jj,product); end end 在这个例子中,外部的for循环将把1赋值于循环指数ii,然后执行内部for循环。内部循环的循环体将被执行3次,它的循环指数ii将会先后被赋值为1,2,3。当完全执行完内部的循环后,外部的for循环将会把2赋值于循环指数ii,然后内部的for循环将会再次执行。直到外部for循环执行3次,这个重复过程结束。产生的结果为 1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 注意外部for循环指数变量增加之前,内部for循环要完全执行完。 当matlab遇到一个end语句,它将与最内部的开放结构联合。所以第一个end语句与语句“for jj = 1:3”,第二个end语句与语句“for ii = 1:3”联合。如果在循环嵌套中一个end语句突然被删除,将会产生许多难以发现的错误。
如果for循环是嵌套的,那么它们必须含有独立的循环变量。如果它们含有相同的循环变量,那么内部循环将改变外部循环指数的值。
如果break或continue语句出现在循环嵌套的内部,那么break语句将会在包含它的最内部的循环起作用。 for ii = 1:3 for jj = 1:3
13
if jj ==3; break; end product = ii * jj; fprintf('%d * %d = %d \\n',ii,jj,product); end fprintf('End of inner loop\\n'); end fprintf('End of outer loop\\n'); 如果内部循环指数jj为3,那么break语句开始执行,这将导致程序跳出内部循环。程序将会打印出”End of inner loop”,外部循环指数将会增加1,内部循环的执行重新开始。产生的输出值为: 1 * 1 = 1 1 * 2 = 2 End of inner loop 2 * 1 = 2 2 * 2 = 4 End of inner loop 3 * 1 = 3 3 * 2 = 6 End of inner loop End of outer loop 4.3 逻辑数组与向量化
在第二章中,我们提出matlab有两个基本类型的数据类型:数字型与字符型。数字型数据包括数字,字符型数据包含字符。除这两个数据类型之外,还有第三类数据类:逻辑型。
“逻辑”数据类型在matlab中并不真实存在。其实,它是带特定逻辑属性标准数字型数据类型。逻辑型数组通过所有的关系运算符和逻辑运算符创建。它们区别于数字型的是在调用whos命令时,(logical)会出现在类型的后面。
例如,考虑下面的语句 a = [1 2 3; 4 5 6; 7 8 9]; b = a > 5; ?123???这些语句将会产生两个数组a和b。a将会产生一个数组456,b将会产生一个????789???000???特殊的含有逻辑属性001。当调用whos命令时,结果如下。注意b后面的(logical)????111??修饰符。 >> whos Name Size Bytes Class a 3x3 72 double array b 3x3 9 logical array Grand total is 18 elements using 81 bytes 我们还可以用logical函数给一个数组加上一个逻辑属性。例如,语句c=logical(a),将会把a值赋于c,从而使c带有一定的逻辑性:
一个数组的逻辑属性可以通任何的数学运算去除。例如,如果我们在c数组加0,数
14
组的值不会改变,而它的逻辑属性将会消失 >> c=b+0 c = 0 0 0 0 0 1 1 1 1 >> whos Name Size Bytes Class a 3x3 72 double array b 3x3 9 logical array c 3x3 72 double array Grand total is 27 elements using 153 bytes 4.3.1 逻辑数组的重要性
逻辑数组有一个重要的属性——它在算术运算中能提供一个屏蔽(mask)。屏蔽(mask)是指一个数组,它从另一个数组选择所需的元素参与运算。指定的运算只在选择的元素上执行,而不执行原有的元素。
例如,假设数组a和b的定义如上节所示。那么语句a(b)=sqrt(a(b))会计算a中相应的元素的平方根,相应的元素是指与b数组中的非零元素相对应的数组a中的元素。其他元素保持不变。 >> a(b)=sqrt(a(b)) a = 1.0000 2.0000 3.0000 4.0000 5.0000 2.4495 2.6458 2.8284 3.0000 对于一个数组的子集快速而简单,而不用循环和选择结构。 下面的语句,是用循环结构和选择结构计算上述问题。 for ii = 1:size(a,1) for jj = 1:size(a,2) if a(ii,jj) > 5 a(ii,jj)=sqrt(a(ii,jj)); end end end b = a > 5; a(b) = sqrt(a(b)); 例4.6
用逻辑数数组进行屏蔽运算为了比较循环结构,选择结构与应用逻辑数组运算的快慢,我们进行下面两个计算,并对它进行计时。
1.创建一个含10000个元素的数组,其值依次为1到10000之间的整数。用for循环和if结构计算大于5000的元素的平方根。
2.创建一个含10000个元素的数组,其值依次为1到10000之间的整数。用逻辑数组计算大于5000的元素的平方根。
答案:
15
共分享92篇相关文档