下面是在 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'函数会返回一些东西?
而且,最重要的是,
- 如何让这个工作?