|
循环速度慢的原因,就是频繁调用sum函数引起的,MATLAB高版本下,循环已经不是瓶颈了,往往函数调用的开销不能忽略。我在新书里对类似这样的情况进行了讨论,改进思路之一就是变“勤拿少取”为“少拿多取”,可以参考下面这个帖子:http://forum.vibunion.com/forum/thread-83299-1-36.html
至于楼主你的问题,我觉得可以这样来实现“少拿多取”:(Chaching兄的思路也很好,也是避免“勤拿少取”的一种方法,下面也附上代码)
- >> clear
- ind = repmat(1:10,10^6,1);
- L = unidrnd(10,10^6,1);
- loc = bsxfun(@le,ind,L);
- A = rand(10^6,10);
- tic;C = sum((A.*loc),2);toc
- E = zeros(10^6,1);
- tic;for k = 1:10^6,E(k) = sum(A(k,1:L(k)));end;toc
- isequal(C,E)
- Elapsed time is 0.277833 seconds.
- Elapsed time is 2.613414 seconds.
- ans =
- 1
- %按Chaching兄的思路
- %
- >> D = zeros(1e6,1);
- tic;
- for k = 1:10
- D(L==k) = sum(A(L==k,1:k),2);
- end
- toc;
- Elapsed time is 0.399268 seconds.
- >> isequal(C,D)
- ans =
- 1
复制代码
[ 本帖最后由 rocwoods 于 2010-5-24 00:50 编辑 ] |
评分
-
1
查看全部评分
-
|