楼主: KingJean
3036 5

[问答] 求助,R语言双层循环速度太慢,能否帮忙改进,谢谢大神! [推广有奖]

  • 0关注
  • 0粉丝

小学生

21%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
105 点
帖子
6
精华
0
在线时间
4 小时
注册时间
2013-9-3
最后登录
2017-9-8

楼主
KingJean 发表于 2017-8-29 22:52:42 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
rm(list=ls())
num.sample=10000
for(N in 1000:10000){

  aa=0

  for(i in 1:num.sample){  

    y1 = mean(rnorm(N,0,1))

    y2=mean( rnorm(N,0.2,1))


    if (abs(y1-y2)<0.23 )   
    {
      aa=aa+1
    }

    bb=aa/num.sample
  }
  if (bb > 0.8) break
}
N

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 Sample break AMPL mean

沙发
hyu9910 在职认证  发表于 2017-8-30 08:24:09
我看到一点:譬如你的rnorm()的随机模拟函数,可以在循环之外先完成的。 这是因为rnorm()可以一次生成很多随机数;如果总共5000个均值和标准差相同的随机数,调用1次rnorm()一起生成,应该比调用5次rnorm()分别产生,要快。
已有 1 人评分经验 论坛币 收起 理由
admin_kefu + 20 + 10 热心帮助其他会员

总评分: 经验 + 20  论坛币 + 10   查看全部评分

藤椅
cheetahfly 在职认证  发表于 2017-8-30 11:27:05
不对,我刚才想拐了。

板凳
KingJean 发表于 2017-8-30 16:10:39
hyu9910 发表于 2017-8-30 08:24
我看到一点:譬如你的rnorm()的随机模拟函数,可以在循环之外先完成的。 这是因为rnorm()可以一次生成很多随 ...
谢谢你,我试试。只不过我在产生随机数的时候,个数是随着循环体内的N变化的。

报纸
cheetahfly 在职认证  发表于 2017-8-30 16:49:55
我试过用C++编写了一个函数,但是效果仍然不理想,应该是反复生成大量随机数,又要重复分配内存空间造成的耗时,于是我想到用完全的R语言的向量化的思维来达到同样的效果:
  1. y1 <- matrix(rnorm(1e4 * 1e4, 0, 1), 1e4)
  2. y2 <- matrix(rnorm(1e4 * 1e4, 0.2, 1), 1e4)
  3. for (N in 1e3:1e4) {
  4.   y1mean <- colMeans(y1[1:N, ])
  5.   y2mean <- colMeans(y2[1:N, ])
  6.   result <- abs(y1mean - y2mean) < 0.23
  7.   if (sum(result) / 1e4 > 0.8) break
  8. }
  9. N
复制代码
返回值的概率分布的期望和方差应该与你的代码返回值的期望和方差是一致的。
另,以下C++版的循环仅作为我自己备查之用:
  1. library(Rcpp)
  2. cppFunction('int calN(int numSample, int begin, int end) {
  3.             double Meany1 = 0;
  4.             double Meany2 = 0;
  5.             int N;
  6.             for(N = begin; N < end; N++) {
  7.               NumericVector y1(N);
  8.               NumericVector y2(N);
  9.               int aa = 0;
  10.               for(int i = 0; i < numSample; i++) {
  11.                 y1 = rnorm(N, 0, 1);
  12.                 y2 = rnorm(N, 0.2, 1);
  13.                 Meany1 = mean(y1);
  14.                 Meany2 = mean(y2);
  15.                 if((Meany2 - Meany1) < 0.23 && (Meany2 - Meany1) > -0.23)
  16.                   aa = aa + 1;
  17.               }
  18.               if(aa > (0.8 * numSample))
  19.                 break;
  20.             }
  21.             return N;
  22.             }')
  23. calN(10000, 1000, 10000)
复制代码

已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

地板
hyu9910 在职认证  发表于 2017-8-31 15:02:59
KingJean 发表于 2017-8-30 16:10
谢谢你,我试试。只不过我在产生随机数的时候,个数是随着循环体内的N变化的。
没关系的吧。 你的N的总数看来是确定的。 而且,你只有2类(均值,标准差)的正态分布的参数组合。

这里牵涉到R和MATLAB编程的一大特点,就是系统提供的矩阵运算的函数要尽量利用,那么避免自己写很多循环。 这样能够达到加速运行的效果。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-20 09:12