心灯 发表于 2008-3-24 21:31

三种不同的循环中对矩阵赋值的代码计算耗时

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

% 第一种
tic;
aa=zeros(1,10);
for ii=1:nn;
    aa(ii,:)=rands(1,10);
end
t1=toc

% 第二种
tic
aa=zeros(2*nn,10);
for ii=1:nn;
    aa(ii,:)=rands(1,10);
end
aa(nn+1:end,:)=[];
t2=toc

% 第三种
tic
aa=[];
for ii=1:nn;
    aa =;
end
t3=toc

tt12 = t1/t2
tt32 = t3/t2计算结果:
t1 =

   2.884425348285759


t2 =

   0.256671953559682


t3 =

   2.961353478201585


tt12 =

11.237789358294924


tt32 =

11.537503171389575

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

sogooda 发表于 2008-3-25 12:03

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

心灯 发表于 2008-3-25 12:56

呵呵,你这个建议和我上面for循环的第二种做法是一样的。 我最好是直接给个正好行数为nn的数组,却给了个2*nn的,然后再删除多余的。 用while的话,就需要专门计数循环次数,然后判断循环次数和预分配空间的大小,决定矩阵是否存在多余的空间。

ChaChing 发表于 2008-3-25 14:25

第二种做法明明只有nn*10
为何初始要设2nn*10, 尔後再删除?
有何目的?

心灯 发表于 2008-3-25 18:32

没啥目的,我先是预先分配恰好的空间尝试了一下,得出了结果,后来把空间给扩大,然后再删除,再看结果,也是因为我考虑了while等不确定性的情况,就想可否对for循环先给大数组,然后再缩小。结果显示,这个时间差别不大。不过for和while有些区别,就是for的循环次数是自己确定的。

dlbsyp 发表于 2008-3-25 20:50

回复 楼主 的帖子

第一种方法要是预先给aa分配nn×10的空间,时间用的还比第二种少些

心灯 发表于 2008-3-25 22:24

对的。
对于第一种,我是尝试若先分配的空间不够,让它在循环中自动根据循环次数的情况扩展,看用时问题。
说到底,我是假设循环次数不是很确定的情况(即while)下做的这个比较。若是我直接拿while代替for,就不会出来你们两位的误会了。怪我没说清楚。
页: [1]
查看完整版本: 三种不同的循环中对矩阵赋值的代码计算耗时