楼主: 天狮
6024 11

[有偿编程] R 中的for 循环用C怎么做? [推广有奖]

  • 1关注
  • 10粉丝

已卖:3427份资源

教授

34%

还不是VIP/贵宾

-

威望
1
论坛币
6262 个
通用积分
355.1019
学术水平
20 点
热心指数
35 点
信用等级
13 点
经验
18386 点
帖子
1396
精华
0
在线时间
533 小时
注册时间
2008-10-10
最后登录
2025-9-4

楼主
天狮 发表于 2011-8-31 17:28:10 |AI写论文
10论坛币
在本论坛本版各位同学特别是epoh大师的帮助下,我学会了如何
通过安装Rtools去实现R和C的混合编程的初步方法,当然主要是
利用dot-C函数,至于dot-Call和Rcpp的方法则没有涉及。

R-C混合编程主要是要利用R做程序主要部分的便捷和C做程序循环部分的快捷。
下面有一例(PS:这个例子是我通过何书元《概率论》P166的例3.3的思想自己构造的,
何老师在书上说:只要测量仪器没有系统偏差,测量精度总可以通过多次测量的平均来改进)
#-----------------------------
#程序跑1000次
n=1000
#首先产生1000行3列元素全为零的矩阵m
m <- matrix(numeric(n*3), ncol = 3)
#下面做循环,进而对矩阵m的元素进行赋值
for (i in 1:n){
        x <- rexp(200) #方差为1
        y <- rpois(200,2) #方差为2
        z<-  rnorm(200,1,2) #方差为4
        m[i,]<-c(var(x),var(y),var(z)) #1000次中每次结果放在矩阵m的每行
}
#对矩阵m求列平均,得到各自最终的方差
final=apply(m,2,mean)
final

我的问题是:如何用C程序去实现上面R程序的循环部分?能用dot-C的方法就更好了。



关键词:For 怎么做 Rtools Tools 混合编程 概率论 测量 程序 如何 仪器

沙发
天狮 发表于 2011-8-31 17:36:18
#---------------------------

下面我将我在本论坛学到的dot-C方法的一个例子的details贴出来供大家参考:

PS:关于相关软件的安装和测试还请各位看官参考我在本版块的另外两篇 帖子:
“如何安装和调试Rtools”和“关于R和C的混合编程”
#--------------------------
#矩阵乘法(R中已有命令为%*%)

#c程序
void matprod  (double *X, int *nrX, int *ncX,
              double *Y, int *nrY, int *ncY, double *ans)
{
  double sum;
  int ii, jj, kk;
  
  for (ii=0; ii<*nrX; ii++){
    for (jj=0; jj<*ncY; jj++){
      sum = 0;
      for (kk=0; kk<*ncX; kk++){
        sum = sum + X[ii+*nrX*kk]*Y[kk+*nrY*jj];
      }
      ans[ii+*nrX*jj] = sum;
    }
  }
}

#生成dll文件
setwd('C:/Users/lenovo/Documents/matprod')#与放matprod文件夹的位置一致
system("R CMD SHLIB matprod.c") #产生两个文件matprod.dll,matprod.o
                                 #windows 用到matprod.dll
#加载dll文件
dyn.load("matprod.dll")#装载或加载

#编写函数
matprod <-function(A,B){
                .C("matprod", as.numeric(A), nrow(A), ncol(A), as.numeric(B),
                nrow(B), ncol(B), ans = numeric(nrow(A) * ncol(B)))$ans
                }

#测试
A <- matrix(1:9, nr = 3)
B <- matrix(1:6, nr = 3)
ans=matprod(A,B)
> ans
[1] 30 36 42 66 81 96
dim(ans) <- c(nrow(A), ncol(B))
> ans
     [,1] [,2]
[1,]   30   66
[2,]   36   81
[3,]   42   96
> A%*%B #与R中build-in函数结果对比完全一样
     [,1] [,2]
[1,]   30   66
[2,]   36   81
[3,]   42   96


藤椅
天狮 发表于 2011-8-31 17:46:38
#---------------------------

下面我将我在本论坛学到的dot-C方法的一个例子的details贴出来供大家参考:

PS:关于相关软件的安装和测试还请各位看官参考我在本版块的另外两篇 帖子:
“如何安装和调试Rtools”和“关于R和C的混合编程”

板凳
天狮 发表于 2011-8-31 17:47:19
是关于矩阵的乘法 (R中已有命令为%*%)

报纸
天狮 发表于 2011-8-31 17:47:37
#c程序
void matprod  (double *X, int *nrX, int *ncX,
              double *Y, int *nrY, int *ncY, double *ans)
{
  double sum;
  int ii, jj, kk;
  
  for (ii=0; ii<*nrX; ii++){
    for (jj=0; jj<*ncY; jj++){
      sum = 0;
      for (kk=0; kk<*ncX; kk++){
        sum = sum + X[ii+*nrX*kk]*Y[kk+*nrY*jj];
      }
      ans[ii+*nrX*jj] = sum;
    }
  }
}

地板
天狮 发表于 2011-8-31 17:48:46
#生成dll文件
setwd('C:/Users/lenovo/Documents/matprod')#与放matprod文件夹的位置一致
system("R CMD SHLIB matprod.c") #产生两个文件matprod.dll,matprod.o
                                 #windows 用到matprod.dll
#加载dll文件
dyn.load("matprod.dll")#装载或加载

7
天狮 发表于 2011-8-31 17:49:13
#编写函数
matprod <-function(A,B){
                .C("matprod", as.numeric(A), nrow(A), ncol(A), as.numeric(B),
                nrow(B), ncol(B), ans = numeric(nrow(A) * ncol(B)))$ans
                }

#测试
A <- matrix(1:9, nr = 3)
B <- matrix(1:6, nr = 3)
ans=matprod(A,B)
> ans
[1] 30 36 42 66 81 96
dim(ans) <- c(nrow(A), ncol(B))
> ans
     [,1] [,2]
[1,]   30   66
[2,]   36   81
[3,]   42   96
> A%*%B #与R中build-in函数结果对比完全一样
     [,1] [,2]
[1,]   30   66
[2,]   36   81
[3,]   42   96

8
天狮 发表于 2011-8-31 17:49:52
#生成.dll文件

9
天狮 发表于 2011-8-31 17:51:39
哎呀、为什么中间的有个贴吧需要审核?那是很关键的。是关于生成和加载dll文件的。

10
zly05 发表于 2011-8-31 17:53:25
这个很有技术含量,可惜我不会,帮顶!

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

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