我已经在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
}

10-07 20:00
查看更多