QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 716|回复: 2
打印 上一主题 下一主题

Matlab——运算的细节

[复制链接]
字体大小: 正常 放大

413

主题

36

听众

1854

积分

升级  85.4%

  • TA的每日心情
    开心
    2019-9-18 21:55
  • 签到天数: 258 天

    [LV.8]以坛为家I

    社区QQ达人

    群组2015国赛冲刺

    群组2016美赛公益课程

    群组国赛讨论

    群组第三届数模基础实训

    群组Matlab讨论组

    跳转到指定楼层
    1#
    发表于 2015-9-7 22:44 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta


                             运算的细节
    既然我们已经看了许多
    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循环计算1100之间的所有整数的平方,平方根,立方根。

    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程序。


    好的编程习惯

    那种既可以用向量可以解决的问题,也可以用循环解决的问题,最好用向量解决,这是因为向量执行的速度快。



    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    数学中国版主团队!
    瞥神        

    1

    主题

    10

    听众

    64

    积分

    升级  62.11%

  • TA的每日心情
    开心
    2015-9-11 07:28
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    社区QQ达人

    群组数学建摸协会

    群组数学建模培训课堂1

    回复

    使用道具 举报

    瞥神        

    1

    主题

    10

    听众

    64

    积分

    升级  62.11%

  • TA的每日心情
    开心
    2015-9-11 07:28
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    社区QQ达人

    群组数学建摸协会

    群组数学建模培训课堂1

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-21 09:05 , Processed in 0.948546 second(s), 60 queries .

    回顶部