楼主: Davidcharge
10761 11

[问答] 多重for循环速度奇慢,求指点~ [推广有奖]

  • 0关注
  • 2粉丝

硕士生

80%

还不是VIP/贵宾

-

威望
0
论坛币
103 个
通用积分
0.0038
学术水平
12 点
热心指数
14 点
信用等级
7 点
经验
3787 点
帖子
168
精华
0
在线时间
215 小时
注册时间
2010-11-6
最后登录
2018-10-16

10论坛币
小弟程序中使用了一段多重for循环,运行10小时进度才不到三分之一…
网上都说应该尽量向量化,但水平实在有限,不知该如何优化,恳请不吝赐教!论坛币不多,聊表心意!
该段程序如下:

h=waitbar(0,' ');                 
f_bar_star=zeros(2210,200);
sigma=zeros(2210,200);
bty=zeros(3533,200);
for n=1:200                        
    for k=1:2210
        f=zeros(1,3533);
        for i=2:3533
            bty(i,n)=(btp(i+150,n)-btp(i+149,n))/btp(i+149,n);
            S(k,i,n)=single(btsignal(k,i,n));                                       
                                               %btsignal是个三维数组,之前为了能存储,就设为int8格式,这里转回single以便计算自然对数
            f(k,i,n)=log(1+bty(i,n)*S(k,i-1,n))-log(1+bty(i,n)*S0);
            sigma(k,n)=sigma(k,n)+f(k,i,n);
        end
        clear f;                                                 %只能每次小循环都预设和清除一次f,直接预设三维数组就会报out of memory
        f_bar_star(k,n)=1/3533*sigma(k,n);
    end
    waitbar(n/200);
end

最佳答案

sddyl 查看完整内容

不知道你的btp是个变量还是个方程。 如果是个变量,最里面那个循环的第一步可以写成 (btp[k:end,n]-btp[k-1:end-1,N])./btp[k-1:end-1,N] 如果是个方程(否则好像size不对吧...),well,那就没招了。如果你是多核的,用 parfor吧,能把运算时间缩到大约1/#worker
关键词:for循环 For 求指点 Signal SINGLE 程序 sigma 如何

本帖被以下文库推荐

沙发
sddyl 发表于 2013-3-30 22:15:42 |只看作者 |坛友微信交流群
不知道你的btp是个变量还是个方程。

如果是个变量,最里面那个循环的第一步可以写成
(btp[k:end,n]-btp[k-1:end-1,N])./btp[k-1:end-1,N]

如果是个方程(否则好像size不对吧...),well,那就没招了。如果你是多核的,用 parfor吧,能把运算时间缩到大约1/#worker
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
Xaero + 100 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

藤椅
yuanxinqiang 发表于 2013-3-31 23:24:10 |只看作者 |坛友微信交流群
三层嵌套肯定慢了。200*2210*3532次循环。

使用道具

板凳
zkymath 在职认证  发表于 2013-4-1 11:05:48 |只看作者 |坛友微信交流群
12核24线程

使用道具

报纸
Davidcharge 发表于 2013-4-1 20:46:27 |只看作者 |坛友微信交流群
sddyl 发表于 2013-4-1 04:58
不知道你的btp是个变量还是个方程。

如果是个变量,最里面那个循环的第一步可以写成
sddyl兄:
btp是一个变量,二维数组哈。
(btp[k:end,n]-btp[k-1:end-1,N])./btp[k-1:end-1,N]  →→→→为啥是用方括号呢?

使用道具

地板
sddyl 发表于 2013-4-6 11:22:45 |只看作者 |坛友微信交流群
Davidcharge 发表于 2013-4-1 20:46
sddyl兄:
btp是一个变量,二维数组哈。
(btp[k:end,n]-btp[k-1:end-1,N])./btp[k-1:end-1,N]  →→→→ ...
python写串了...应该是括弧 : )

使用道具

7
Davidcharge 发表于 2013-4-6 15:28:08 |只看作者 |坛友微信交流群
sddyl 发表于 2013-4-6 11:22
python写串了...应该是括弧 : )
虽然我后来自己搞定了,还是谢谢!
向量化之后原来跑30个小时的程序一分钟就能运行得到结果

使用道具

8
转角遇到爱981 发表于 2013-10-24 10:29:51 |只看作者 |坛友微信交流群
求助楼主啊,我也是for循环很慢,都等了30多个小时了,能不能楼主指导一下如何向量化啊,急用,谢谢

使用道具

9
张静静 发表于 2013-10-24 10:48:26 |只看作者 |坛友微信交流群
能用矩阵就别用for loop

使用道具

10
Davidcharge 发表于 2013-10-25 19:13:25 |只看作者 |坛友微信交流群
转角遇到爱981 发表于 2013-10-24 10:29
求助楼主啊,我也是for循环很慢,都等了30多个小时了,能不能楼主指导一下如何向量化啊,急用,谢谢
可以加我QQ 182456270

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 07:47