全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
20628 22
2011-06-28
悬赏 10 个论坛币 已解决
因为R是解释类型语言,所以考虑到效率问题我们多采用主要部分用R、迭代部分用C。但是我不知道如何将R和C进行混合编程。
譬如我们求1+2^3+3^3+4^3+....+n^3 (当然这个用R的向量计算也相当方便),我们可以很容易地写出用R循环来计算该问题的代码。
sum=function(n){
for(i in 1:n)
循环部分
}

下面我们写出用C来计算循环
#include<stdio.h>
main()
{int sum=0,n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
sum+=i*i*i;
printf("\n%d",sum);
getch();
}
我们将上面的c代码命名为sum.c
我电脑上只安装了win-TC,上述代码运行通过(我输入3,返回36),并且产生了三个文件,分别是:
sum.c和sum.exe及sum.obj
好了,现在我的问题就是如何将c嵌入到R中去代替R的循环计算。
希望高手解答,以便以后碰到更复杂的循环可以节省大量时间,R有时候还是稍显慢。

最佳答案

epoh 查看完整内容

1.你可选择自行安装MinGW (GCC) Compiler http://www.mingw.org/wiki/InstallationHOWTOforMinGW 也可选择安装 Rtools (建议) http://www.murdoch-sutherland.com/Rtools/index.html 2. C:/Users/lenovo/Documents 建立文件夹convolve,放入文件convolve.c 然后在R运行: ############ setwd('C:/Users/lenovo/Documents/convolve') system("R CMD SHLIB convolve.c") #产生两个文件convolve.dll,convo ...
二维码

扫码加我 拉你入群

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

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

全部回复
2011-6-28 22:25:27
1.你可选择自行安装MinGW (GCC) Compiler
   http://www.mingw.org/wiki/InstallationHOWTOforMinGW
  也可选择安装 Rtools (建议)
   http://www.murdoch-sutherland.com/Rtools/index.html


2. C:/Users/lenovo/Documents

建立文件夹convolve,放入文件convolve.c

然后在R运行:
############
setwd('C:/Users/lenovo/Documents/convolve')
system("R CMD SHLIB convolve.c")  #产生两个文件convolve.dll,convolve.o
                                  #windows 用到convolve.dll

dyn.load("convolve.dll")
conv <- function(a, b){
.C("convolve",
as.double(a), as.integer(length(a)),
as.double(b), as.integer(length(b)),
ab=double(length(a)+length(b)-1))$ab
}
a=3
b=4
conv(a,b)

##########
convolve.c, convolve.dll
convolve.rar
大小:(3.2 KB)

 马上下载



二维码

扫码加我 拉你入群

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

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

2011-6-28 23:49:54
R中自带的两个函数.c()  .call()可以用来处理LZ想运行的C函数,两者的使用略有差别。比如lz可以另加一个wrapper函数,其中的变量类型用C和R接口的变量类型(具体参见CRAN manual),用这个函数来调用你写好的C函数。在R中运行的时候,通过.call()在R中调用wrapper函数。wrapper的作用主要就是让R和C函数中的变量可以相互转换使用,相当于一个接口。头文件可能需要稍做改动。

另外,更简单的方式是用package Rcpp 。 这个包绝对是一个非常出色的产品,LZ可以下载来看看,可以用于C或C++。

关于你所说的三个文件,在用上述方式调用的时候,不会产生exe等文件,你要做的就是有源文件即可。编译的工作由R调用你系统下的C编译器运行,结果直接返回R。我不用windows,不清楚在windows下面跑对编译器有没有什么特殊要求,但是常用的编译器应该可以正常工作。
二维码

扫码加我 拉你入群

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

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

2011-6-29 00:38:52
只能用GCC。
二维码

扫码加我 拉你入群

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

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

2011-6-29 21:55:17
版主正解,Rcpp有PDF帮助文件,看完就会了。
二维码

扫码加我 拉你入群

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

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

2011-6-30 00:51:03
首先感谢版主ltx5151 。但是我给出具体例子的初衷还是想请教高人结合具体例子给出详细操作,我也有看过不少资料,其中李东风书上给出了一个计算卷积的例子,算是写的比较详细的。但是我不知道“C程序编译成了一个DLL库testdll.dll放在当前工作目录中”这句话,因为后面好像要用到testdll.dll。我用Win-TC编译C源程序得到了sum.c、sum.exe和sum.obj三个文件(就上面例子而言),并没有什么.dll文件啊。所以,我还是等等看。谨再谢!
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群