#---------------------------
下面我将我在本论坛学到的dot-C方法的一个例子的details贴出来供大家参考:
PS:关于相关软件的安装和测试还请各位看官参考我在本版块的另外两篇 帖子:
“如何安装和调试Rtools”和“关于R和C的混合编程”
#--------------------------
#矩阵乘法(R中已有命令为%*%)
#c程序
void matprod (double *X, int *nrX, int *ncX,
double *Y, int *nrY, int *ncY, double *ans)
{
double sum;
int ii, jj, kk;
for (ii=0; ii<*nrX; ii++){
for (jj=0; jj<*ncY; jj++){
sum = 0;
for (kk=0; kk<*ncX; kk++){
sum = sum + X[ii+*nrX*kk]*Y[kk+*nrY*jj];
}
ans[ii+*nrX*jj] = sum;
}
}
}
#生成dll文件
setwd('C:/Users/lenovo/Documents/matprod')#与放matprod文件夹的位置一致
system("R CMD SHLIB matprod.c") #产生两个文件matprod.dll,matprod.o
#windows 用到matprod.dll
#加载dll文件
dyn.load("matprod.dll")#装载或加载
#编写函数
matprod <-function(A,B){
.C("matprod", as.numeric(A), nrow(A), ncol(A), as.numeric(B),
nrow(B), ncol(B), ans = numeric(nrow(A) * ncol(B)))$ans
}
#测试
A <- matrix(1:9, nr = 3)
B <- matrix(1:6, nr = 3)
ans=matprod(A,B)
> ans
[1] 30 36 42 66 81 96
dim(ans) <- c(nrow(A), ncol(B))
> ans
[,1] [,2]
[1,] 30 66
[2,] 36 81
[3,] 42 96
> A%*%B #与R中build-in函数结果对比完全一样
[,1] [,2]
[1,] 30 66
[2,] 36 81
[3,] 42 96


雷达卡


京公网安备 11010802022788号







