回复 第4楼 的 Ihavenothing:
我刚刚试了一下.C(),但是出了点问题。我做一个两个矩阵相加的运算作为实验。
C 函数如下(madd.c)
<br />
#include <stdlib.h><br />
void madd(double *a, double *b, double *c, int *nrow, int *ncol){<br />
int i, j;</p>
<p> // Convert vector parameter a from R to matrices in C<br />
int **A = malloc((*nrow) * sizeof(double *));<br />
for (i=0; i<*nrow; i++){<br />
A[i] = malloc((*ncol) * sizeof(double));<br />
}<br />
for (i=0; i<*nrow; i++){<br />
for (j=0; j<*ncol; j++){<br />
A[i][j] = a[j * (*nrow) + i];<br />
}<br />
}</p>
<p> // Convert vector parameter b from R to matrices in C<br />
int **B = malloc((*nrow) * sizeof(double *));<br />
for (i=0; i<*nrow; i++){<br />
B[i] = malloc((*ncol) * sizeof(double));<br />
}<br />
for (i=0; i<*nrow; i++){<br />
for (j=0; j<*ncol; j++){<br />
B[i][j] = b[j * (*nrow) + i];<br />
}<br />
}</p>
<p> // do addition<br />
int **C = malloc((*nrow) * sizeof(double *));<br />
for (i=0; i<*nrow; i++){<br />
C[i] = malloc((*ncol) * sizeof(double));<br />
}</p>
<p> for (i=0; i<*nrow; i++){<br />
for (j=0; j<*ncol; j++){<br />
C[i][j] = A[i][j] + B[i][j];<br />
}<br />
}</p>
<p> // Convert C matrix to parameter c from R<br />
for (i=0; i<*nrow; i++){<br />
for (j=0; j<*ncol; j++){<br />
c[j * (*nrow) + i] = C[i][j];<br />
}<br />
}</p>
<p> // free memories of A, B and C<br />
for (i=0; i<*nrow; i++){<br />
free(A[i]);<br />
free(B[i]);<br />
free(C[i]);<br />
}<br />
free(A);<br />
free(B);<br />
free(C);<br />
}<br />
编的比较繁琐,因为是想验证一下机制。
R 的 wapper 如下(madd.R):
<br />
madd <- function(a, b){<br />
nra <- nrow(a)<br />
nrb <- nrow(b)<br />
nca <- ncol(a)<br />
ncb <- ncol(b)</p>
<p> if ( !(nra==nrb) && (nca==ncb) ){<br />
stop("a and b must have same dinmention!")<br />
}</p>
<p> result <- .C("madd",<br />
as.double(a),<br />
as.double(b),<br />
c = double(length=nra*nrb),<br />
as.integer(nra),<br />
as.integer(nrb),<br />
DUP=FALSE<br />
)<br />
return(as.matrix(result[[3]], nrow=nra, ncol=nca))<br />
}<br />
主函数如下:
<br />
dyn.load("madd.so")<br />
source("madd.R")<br />
a <- matrix(runif(4), nrow=2, ncol=2)<br />
b <- matrix(runif(4), nrow=2, ncol=2)<br />
c <- a<br />
c <- as.matrix(madd(a, b))<br />
a<br />
b<br />
c<br />
但是运行的结果像 c 没有改变的样子,我将 DUP 参数设成 FALSE 也不管用阿
<br />
> a<br />
[,1] [,2]<br />
[1,] 0.4095104 0.07397676<br />
[2,] 0.4061717 0.95746320</p>
<p>> b<br />
[,1] [,2]<br />
[1,] 0.8984510 0.4088885<br />
[2,] 0.8115202 0.4309612</p>
<p>> c<br />
[,1]<br />
[1,] 0<br />
[2,] 0<br />
[3,] 0<br />
[4,] 0<br />
不知道为啥?[s:12]
</p>