re-us 发表于 2010-5-23 03:05

能不能不用循环?

L=;
B= ;

B是一个3*10的矩阵,想要结果是求出第一行从第一个到第二个的和,第二行从第一个到第四个的和,第三行从第一个到第五个的和。即:sum(B(1,1:2)), sum(B(1,1:4)), sum(B(1,1:5))
能不能不用循环。谢谢

yufeng 发表于 2010-5-23 08:26

sum(B(1,1:2)), sum(B(1,1:4)), sum(B(1,1:5))
就可以

re-us 发表于 2010-5-23 21:36

回复 沙发 yufeng 的帖子

不好意思,没有说清楚。
比如B是10000000*10的矩阵,L是1*10000000,并且L中的数字是不一样的。目的是求出B中每一行的第一个到第L(i)的和。我现在的办法是用循环,很慢。有没有办法不用循环。

谢谢回复

ChaChing 发表于 2010-5-23 22:36

回复 板凳 re-us 的帖子

早找过! 一时没找着现成的函数! :@L
同待高人路过
可否请教L或B是否存在某些规律!?

[ 本帖最后由 ChaChing 于 2010-5-23 22:38 编辑 ]

ChaChing 发表于 2010-5-24 00:20

原帖由 re-us 于 2010-5-23 21:36 发表 http://www.chinavib.com/forum/images/common/back.gif
...B是10000000*10的矩阵,L是1*10000000...
刚注意到一点, 若LZ以for ii=1:10000000循环, 当然很慢!
因L的范围一定是1~10, 何不试试以for ii=1:10循环!?
aa=zeros(size(B,1),1);
for ii=1:10, ind=find(L==ii);
if ~isempty(ind), aa(ind)=sum(B(ind,1:ii)'); end
end

本想用编辑, 怕LZ不知有回应! 等LZ试过再合并!

rocwoods 发表于 2010-5-24 00:40

循环速度慢的原因,就是频繁调用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 编辑 ]

re-us 发表于 2010-5-24 04:15

两位的想法太牛了。
rocwoods的方法成功避免了for循环,受益匪浅呀。chacheng的想法很新颖,很好很好。
把rocwoods的C = sum((A.*loc),2);toc这个改成C = sum((ind.*loc),2), 就是我所要的结果了。
另外,chacheng的aa(ind)=sum(B(ind,1:ii)')改成aa(ind)=sum(B(ind,1:ii)',1),不然当ii是1的时候得不到想要的结果。比如:

clc; clear
tic
B = repmat(1:10,10^2,1);
L = ;
aa=zeros(size(B,1),1);
for ii=1:2
    ind=find(L==ii);
   if ~isempty(ind), aa(ind)=sum(B(ind,1:ii)'); end
end
toc

谢谢,谢谢。

[ 本帖最后由 ChaChing 于 2010-5-24 11:25 编辑 ]

ChaChing 发表于 2010-5-24 11:24

回复 6楼 rocwoods 的帖子

高手就是高手! 底子强果然是有差的, 自叹不如!
由于目前是使用旧本(v5.6), roc所用的函数并没有, 尚无法验证学习, 回家再试!
页: [1]
查看完整版本: 能不能不用循环?