数学建模社区-数学中国
标题: Matlab——运算的细节 [打印本页]
作者: 森之张卫东 时间: 2015-9-7 22:44
标题: Matlab——运算的细节
运算的细节
既然我们已经看了许多for循环的例子。在用for循环时,我们必须检查许多重要的细节。
1.没有必要缩进for循环的循环体。即使所有语句都左对齐,matlab程序也会识别出这个循环。但缩进循环体能增强代码的可读性,所以建议大家缩进循环体。
好的编程习惯
对于for循环体总是要缩进两个或更多空格,以增强程序的可读性。
2.在for循环中,我们不能随意修改循环指数。循环指数常被用作计算器,
如果修改了它们将会导致一些奇怪而难以发现的错误。下面的一个例子将初始化一个函数的数组。但是语句“ii=5”的突然出现,导致只有a(5)得到了初始化,它得到了本应赋给a(1),a(2)等等的值。
for ii = 1:10
...
ii = 5 ; %Error!
...
a(ii) = <calculation>
end
好的编程习惯
在循环体中绝不修改循环指数的值。
3.我们在第二章已经学过,用赋值的方法可以扩展一个已知的数组。例如,语句
arr = 1:4;
定义了一个数组[1 2 3 4]。如果执行语句
arr(8) = 6;
将会产生一个八元素数组[1 2 3 4 0 0 0 6]。不幸的是,每一次扩展数组,都要经过以下步骤:第一步,创建一个新数组。第二步,把旧数组的元素复制到新数组当中。第三步,把扩展的元素写入新数组。第四步,删除旧数组。对于大数组来说这些步骤是相当耗时的。
当一个for循环中存储了一个预先未定义的数组,在第一次循环执行的时侯,循环结构迫使matlab重复执行以上步骤。从另一方面说,如果在循环开始之前数组预先分配了数组的大小,那么复制就不需要了,执行代码的速度也将加快。下面代码片段向大家展示了在循环开始之前如何预先分配数组。
好的编程习惯
在循环执行开始之前,总是要预先分配一个数组,这样能大大增加循环运行的速度。
4.用for循环和向量计算是非常常见的。例如,下面的代码片段用for循环计算1到100之间的所有整数的平方,平方根,立方根。
for ii = 1:100
square(ii) = ii ^2;
square_root(ii) = ii ^ (1/2);
cube_root(ii) = ii ^ (1/3);
end
下面一个代码片段是用向量计算上面的问题。
ii = 1:100;
square = ii .^2;
square_root = ii .^ (1/2);
cube_root(ii) = ii .^ (1/3);
尽管两种算法得到了相同的结果,但两者并不同等价。因为for循环算法比向量算法慢15倍还多。这是由于matlab通过每一次循环时,每行都要翻译执行一次。也相当于matlab翻译执行了300行代码。相反,如果用向量算法,matlab只需要翻译执行4行代码。所以用向量语句它的执行速度非常快。
向量算法的缺点是需要很大的内存,因为一些间接的数组需要创建。这经常是一小点损失,所以要比for循环算法好的多。
在matlab中,用向量算法代替循环的算法的过程称之为向量化(vectorization)。向量化能够改进许多的matlab程序。
好的编程习惯
那种既可以用向量可以解决的问题,也可以用循环解决的问题,最好用向量解决,这是因为向量执行的速度快。
作者: 瞥神 时间: 2015-9-8 17:57
非常好!!!!!!!!!!!!!!
作者: 瞥神 时间: 2015-9-8 17:57
非常好!!!!!!!!!!!!!!
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |