我已经在C语言中编写了一个函数“foo”,我想从R程序中调用它。该函数将矩阵作为输入并对其执行一些操作(例如,向每个元素加1)。虽然很容易将单个向量作为
.C("foo", n=as.integer(5), x=as.double(rnorm(5)))
与foo实现为
void foo(int *nin, double *x)
{
int n = nin[0];
int i;
for (i=0; i<n; i++)
x[i] = x[i] * x[i];
}
如何传递二维数组?如果我将“double * x”更改为“double ** x”,则会出现段错误。任何指针表示赞赏。
最佳答案
无需放弃.C
即可进行这样的直接操作。请记住,R中的矩阵是向量+维。同样在C语言中,将矩阵及其维数传递给矩阵,并将矩阵的元素作为适当的偏移量传递到向量中。就像是
void cplus1(double *x, int *dim)
{
for (int j = 0; j < dim[1]; ++j)
for (int i = 0; i < dim[0]; ++i)
x[j * dim[0] + i] += 1;
}
所以使用
inline
作为一个不错的聚会把戏library(inline)
sig <- signature(x="numeric", dim="integer")
body <- "
for (int j = 0; j < dim[1]; ++j)
for (int i = 0; i < dim[0]; ++i)
x[j * dim[0] + i] += 1;
"
cfun <- cfunction(sig, body=body, language="C", convention=".C")
plus1 <- function(m) {
m[] = cfun(as.numeric(m), dim(m))$x
m
}