R .C接口:传递多维数组

前端之家收集整理的这篇文章主要介绍了R .C接口:传递多维数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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;
}

所以使用内联作为一个很好的派对技巧

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
}
原文链接:https://www.f2er.com/c/115911.html

猜你在找的C&C++相关文章