三种不同的循环中对矩阵赋值的代码计算耗时
在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循环,是不是我们就不得不放弃第二种,采用第一种或第三种赋值方式了呢?除此之外,有没有更好的方法呢? 欢迎大家讨论。 有的采用while循环的问题也应该是可以预先估计结束的次数吧,虽然不一定准。——当然这只是特殊情况啦。
如果完全不能估计,问题的规模不大的话可不可以先弄个大点儿的,循环结束之后再去掉多余的。
一点拙见,班门弄斧了~ 呵呵,你这个建议和我上面for循环的第二种做法是一样的。 我最好是直接给个正好行数为nn的数组,却给了个2*nn的,然后再删除多余的。 用while的话,就需要专门计数循环次数,然后判断循环次数和预分配空间的大小,决定矩阵是否存在多余的空间。 第二种做法明明只有nn*10
为何初始要设2nn*10, 尔後再删除?
有何目的? 没啥目的,我先是预先分配恰好的空间尝试了一下,得出了结果,后来把空间给扩大,然后再删除,再看结果,也是因为我考虑了while等不确定性的情况,就想可否对for循环先给大数组,然后再缩小。结果显示,这个时间差别不大。不过for和while有些区别,就是for的循环次数是自己确定的。
回复 楼主 的帖子
第一种方法要是预先给aa分配nn×10的空间,时间用的还比第二种少些 对的。对于第一种,我是尝试若先分配的空间不够,让它在循环中自动根据循环次数的情况扩展,看用时问题。
说到底,我是假设循环次数不是很确定的情况(即while)下做的这个比较。若是我直接拿while代替for,就不会出来你们两位的误会了。怪我没说清楚。
页:
[1]