楼主: 坏半半
2199 10

[编程问题求助] 【求助】循环问题... [推广有奖]

  • 1关注
  • 0粉丝

硕士生

33%

还不是VIP/贵宾

-

威望
0
论坛币
29447 个
通用积分
2.7000
学术水平
2 点
热心指数
2 点
信用等级
2 点
经验
2695 点
帖子
108
精华
0
在线时间
146 小时
注册时间
2010-1-8
最后登录
2024-12-6

楼主
坏半半 发表于 2014-2-1 18:28:36 |AI写论文
66论坛币
一般循环已经搞定了,出现了一个问题,请大伙帮帮忙看看啦
forvalues i=1/20000 {
forvalues j=1/15 {
replace A=sum(B*C) if code1==`j' & code2==`i'
}
}
其中A, B, C, code1, 和code2都是已经定义好的变量。

其中code1=1/15, code2=1/20000。

这个command检测过了没问题,可是,速度太慢了....因为observation有500万...

第一当然是求助有没有什么优化的建议了。

我自己想的优化办法是:

由于code1与code2未必完全对应,比如:
code2=1时,code1只有1,2,5,15,也就是说内循环中只循环着4个值就行了。

所以我把command改成了:

forvalues i=1/20000 {
forvalues j=1/15 {
if code1==`j'  {          //当code1存在等于循环值的时候再进行下面的替换操作//
replace A=sum(B*C) if code1==`j' & code2==`i'
}
}
}

问题来了,为什么这个command内循环转完1就开始外循环了,内循环只能转1轮...

求大家帮帮忙啦!解答一下!新年快乐!


关键词:observation forvalues forvalue observat Command

沙发
守望沙滩 发表于 2014-2-1 18:57:55
支持

藤椅
坏半半 发表于 2014-2-2 03:16:46
自顶一贴求帮助!

板凳
坏半半 发表于 2014-2-2 09:34:57 来自手机
求指导啊求指导

报纸
坏半半 发表于 2014-2-2 17:35:26 来自手机
再顶一次。。。

地板
dxystata 发表于 2014-2-2 21:58:44
forvalues j=1/15 {
改为
foreach j of numlist 1 2 5 15 {

7
坏半半 发表于 2014-2-3 02:04:26 来自手机
dxystata 发表于 2014-2-2 21:58
forvalues j=1/15 {
改为
foreach j of numlist 1 2 5 15 {
不行的 对i =1时是对的 但是i=2怎么办? 往后怎么办?范围是1到15阿 用foreach就把范围锁定了阿

谢谢!

8
dxystata 发表于 2014-2-3 03:31:28
坏半半 发表于 2014-2-3 02:04
不行的 对i =1时是对的 但是i=2怎么办? 往后怎么办?范围是1到15阿 用foreach就把范围锁定了阿

谢谢!
你问题写清楚啊!

9
坏半半 发表于 2014-2-3 05:59:37
dxystata 发表于 2014-2-3 03:31
你问题写清楚啊!
forvalues i=1/20000 {
forvalues j=1/15 {
replace A=sum(B*C) if code1==`j' & code2==`i'
}
}

如顶楼说的,这个循环是没问题的,但是数据量太大,速度太慢。

这是一个替代的内嵌循环, 观察数据后发现code2=1的时候,code1只有对应的 1 2 5 15.

也就是说对于i=1,内循环 j不需要走3 4 6 7...14的循环。

但是当i=2时,也就是对应的code2=2时,对应的code1,也就是j 可能对应有4 6 7 8 9。

所以对于i=1/2000所对应的j是不一样的,但是j始终是<=15的正整数,因此foreach是不行的。

我想的优化方法是追加if条件到内循环里,这样就变成了:
forvalues i=1/20000 {
forvalues j=1/15 {
if code1==`j'  {          //当code1存在等于循环值的时候再进行下面的替换操作//
replace A=sum(B*C) if code1==`j' & code2==`i'
}
}
}

这样对于i=1,如果code1==`j'的时候再走循环,但是这个command运行完j=1就跳到i=2里去执行j=1了。
我不知道怎么能把这个if用好,怎么样才能让内循环一直执行到15,再去算i=2到2000。

表述的不好请谅解啦,较繁琐,还请多多指点,谢谢!

10
坏半半 发表于 2014-2-4 20:30:08 来自手机
尚未解决 自顶

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-1 04:46