gpt4 book ai didi

c - 从 R 矩阵读取/写入 C 数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:10 25 4
gpt4 key购买 nike

下面是一个在 R 中创建 3 个矩阵的最小示例,应该通过调用 C 代码来操作

简而言之,我想将矩阵 A 从 R 传递到 C,然后将一些值复制到 W 和 H 矩阵。后 2 个我想在 R 中使用修改后的值。

但是,这不太有效(段错误,或返回空矩阵)。我怀疑 R 复制对象以在 C 中使用,而不是通过引用传递它们。

C 源代码(test.c):

void test(double *A, double *W, double *H, int m, int n, int k) {
// A is input with dimensions (m,n)
// W has dimensions (m,k)
// H has dimensions (k,n)

int i;

for(i=0; i<m*k; i++)
W[i] = A[i];

for(i=0; i<k*n; i++)
H[i] = A[i];
}

一些构建指令(Makefile):

CCFLAGS = -fPIC

all: shared

shared: test.o
$(CC) -shared -Wl,-soname,test.so -o test.so test.o

test.o: test.c
$(CC) $(CCFLAGS) -c $<

这就是调用它的 R 代码:

dyn.load("test.so")

m = 3
n = 3
k = 2

A = matrix(c(1:(m*n)), nrow=m, ncol=n)

W = matrix(0, nrow=m, ncol=k)
H = matrix(0, nrow=k, ncol=n)

.C("test", as.double(A), as.double(W), as.double(H),
as.integer(m), as.integer(n), as.integer(k))

现在我的问题:

  • 为什么大多数时候会出现这个段错误?
  • 有没有办法用未初始化的 R 矩阵调用 C 函数?
  • 为什么“void”函数会返回一些东西?

最重要的是,

  • 如何让它发挥作用?

最佳答案

  • 为什么大多数时候会出现这个段错误?

这(可能)是因为您的函数采用整数,而 .C 接口(interface)将传入指针。你的签名应该是

void test(double *A, double *W, double *H, int *m, int *n, int *k)
  • 有没有办法用未初始化的 R 矩阵调用 C 函数?

在调用 .C 时设置 DUP=FALSE 将阻止 .C 复制您传递给它的数组。有关详细信息,请参见 ?.C

  • 为什么“void”函数会返回一些东西?

C 函数不返回任何内容,但 R 函数 .C 返回一个列表,对应于传递给 C 函数的参数。再次参见 ?.C

  • 如何让它发挥作用?

你有两个选择。第一种是设置 DUP=FALSE 并让 C 函数修改现有的 R 对象。但是,如果这样做,您需要确保在将它们传递给外部调用之前调用了 as.double,否则 as.double 将被迫创建新对象,因为当前定义的 WH 将是整数类型。

您的第二个选择是保留 DUP=TRUE,并使用 .C 调用的返回值,如下所示:

result<-.C("test", as.double(A), W=as.double(W), H=as.double(H), 
as.integer(m), as.integer(n), as.integer(k))
W<-result$W
H<-result$H

关于c - 从 R 矩阵读取/写入 C 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19600511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com