楼主: luostc
2393 4

[问答] R中调用C,如何传递矩阵参数? [推广有奖]

  • 0关注
  • 0粉丝

小学生

14%

还不是VIP/贵宾

-

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

楼主
luostc 发表于 2014-2-24 12:28:12 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
小弟最近无法忍受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)。但是矩阵情况下我尝试过各种写法,都不成功。希望高手能帮忙解答!

二维码

扫码加我 拉你入群

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

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

关键词:thread double import pinggu HTML 如何

沙发
nuomin 发表于 2014-2-26 22:12:36
把你的代码写成向量运算形式,这样回避了显式的循环,运算速度会快很多。R中不建议用循环。
另,你先传数组,在c代码中组合成矩阵不也一样?
用R写的话
  1. > k <- 10000
  2. > system.time(kk <- sapply(0:(k-1),function(x) seq(x,x-k+1,-1)))
  3.    user  system elapsed
  4.    4.01    0.33    4.79
复制代码
速度还行吧

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

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

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

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

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

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

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

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