声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1250|回复: 6

[编程技巧] 三种不同的循环中对矩阵赋值的代码计算耗时

[复制链接]
发表于 2008-3-24 21:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
在matlab中,循环中对矩阵赋值,第三种代码会显示warning,提示可能耗时太多。所以针对for循环,尝试了下面的语句,结果计算耗时如下,可见第一、第三种的计算时间可能远远的大于第二种,尤其是在循环次数很多的时候。
  1. nn=5000;

  2. % 第一种
  3. tic;  
  4. aa=zeros(1,10);
  5. for ii=1:nn;
  6.     aa(ii,:)=rands(1,10);
  7. end
  8. t1=toc

  9. % 第二种
  10. tic
  11. aa=zeros(2*nn,10);
  12. for ii=1:nn;
  13.     aa(ii,:)=rands(1,10);
  14. end
  15. aa(nn+1:end,:)=[];
  16. t2=toc

  17. % 第三种
  18. tic
  19. aa=[];
  20. for ii=1:nn;
  21.     aa =[aa;rands(1,10)];
  22. end
  23. t3=toc

  24. tt12 = t1/t2
  25. tt32 = t3/t2
复制代码
计算结果:
t1 =

   2.884425348285759


t2 =

   0.256671953559682


t3 =

   2.961353478201585


tt12 =

  11.237789358294924


tt32 =

  11.537503171389575


对于for循环,很明显我们很容易就知道循环的次数了,可以预先给矩阵分配空间。可是对于while循环,是不是我们就不得不放弃第二种,采用第一种或第三种赋值方式了呢?除此之外,有没有更好的方法呢? 欢迎大家讨论。
回复
分享到:

使用道具 举报

发表于 2008-3-25 12:03 | 显示全部楼层
有的采用while循环的问题也应该是可以预先估计结束的次数吧,虽然不一定准。——当然这只是特殊情况啦。
如果完全不能估计,问题的规模不大的话可不可以先弄个大点儿的,循环结束之后再去掉多余的。
一点拙见,班门弄斧了~

评分

1

查看全部评分

 楼主| 发表于 2008-3-25 12:56 | 显示全部楼层
呵呵,你这个建议和我上面for循环的第二种做法是一样的。 我最好是直接给个正好行数为nn的数组,却给了个2*nn的,然后再删除多余的。 用while的话,就需要专门计数循环次数,然后判断循环次数和预分配空间的大小,决定矩阵是否存在多余的空间。
发表于 2008-3-25 14:25 | 显示全部楼层
第二种做法明明只有nn*10
为何初始要设2nn*10, 尔後再删除?
有何目的?
 楼主| 发表于 2008-3-25 18:32 | 显示全部楼层
没啥目的,我先是预先分配恰好的空间尝试了一下,得出了结果,后来把空间给扩大,然后再删除,再看结果,也是因为我考虑了while等不确定性的情况,就想可否对for循环先给大数组,然后再缩小。结果显示,这个时间差别不大。不过for和while有些区别,就是for的循环次数是自己确定的。
发表于 2008-3-25 20:50 | 显示全部楼层

回复 楼主 的帖子

第一种方法要是预先给aa分配nn×10的空间,时间用的还比第二种少些
 楼主| 发表于 2008-3-25 22:24 | 显示全部楼层
对的。
对于第一种,我是尝试若先分配的空间不够,让它在循环中自动根据循环次数的情况扩展,看用时问题。
说到底,我是假设循环次数不是很确定的情况(即while)下做的这个比较。若是我直接拿while代替for,就不会出来你们两位的误会了。怪我没说清楚。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-23 13:31 , Processed in 0.057778 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表