全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
2394 4
2014-02-24
小弟最近无法忍受R在大量循环计算中的速度,决心在R中调用C的函数。看了epoh老师关于R和C混编的讲解后深受启发https://bbs.pinggu.org/thread-1126777-1-1.html

但是现在我碰到了一个问题,如果我在void中传递的参数不是数或者一维数组,而是一个矩阵:一个简单的例子如下

DLLIMPORT void myfun(int *k, double **ab)
{
int i, j;  
for(i = 0; i < *k; i++)
       for(j = 0; j < *k; j++)
             ab [l][j] = i-j;              
}

那么接下来在R中调用dll文件时
dyn.load("myfun.dll")
myf <- function(k){
.C("myfun",
as.integer(k),
ab=???)$ab
}

这里的???该用什么了。如果ab是数组,我可以用double(xxx)。但是矩阵情况下我尝试过各种写法,都不成功。希望高手能帮忙解答!

二维码

扫码加我 拉你入群

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

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

全部回复
2014-2-26 22:12:36
把你的代码写成向量运算形式,这样回避了显式的循环,运算速度会快很多。R中不建议用循环。
另,你先传数组,在c代码中组合成矩阵不也一样?
用R写的话
复制代码
速度还行吧
二维码

扫码加我 拉你入群

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

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

2014-2-27 08:28:33
nuomin 发表于 2014-2-26 22:12
把你的代码写成向量运算形式,这样回避了显式的循环,运算速度会快很多。R中不建议用循环。
另,你先传数组 ...
apply/supply确实是一个好办法,不过太过复杂的循环不好弄啊

我这几天仔细查了文献,.C没有办法传递矩阵的,只能像你你所说传递数组进去。或者用.Call
二维码

扫码加我 拉你入群

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

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

2014-3-1 21:06:09
用.C只能把矩阵当作vector来用,你可以传入一个向量,还有他的nrow, ncol,在C里面也可以index

.C是个古董的东西了, 建议你用Rcpp,非常好用,写R里面的C++和写R code差不多好写。
二维码

扫码加我 拉你入群

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

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

2014-3-4 07:44:39
ntsean 发表于 2014-3-1 21:06
用.C只能把矩阵当作vector来用,你可以传入一个向量,还有他的nrow, ncol,在C里面也可以index

.C是个古 ...
谢谢啊,我去找Rcpp试试看
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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