//R用 C //#include //#include #include #include #include void convolve(double *a, int *na, double *b, int *nb, double *ab) { int i, j, nab = *na + *nb - 1; for(i = 0; i < nab; i++) ab[i] = 0.0; for(i = 0; i < *na; i++) for(j = 0; j < *nb; j++) ab[i + j] += a[i] * b[j]; } SEXP convolve2(SEXP a, SEXP b) { int i, j, na, nb, nab; double *xa, *xb, *xab; SEXP ab; PROTECT(a = AS_NUMERIC(a)); PROTECT(b = AS_NUMERIC(b)); na = LENGTH(a); nb = LENGTH(b); nab = na + nb - 1; PROTECT(ab = NEW_NUMERIC(nab)); xa = NUMERIC_POINTER(a); xb = NUMERIC_POINTER(b); xab = NUMERIC_POINTER(ab); for(i = 0; i < nab; i++) xab[i] = 0.0; for(i = 0; i < na; i++) for(j = 0; j < nb; j++) xab[i + j] += xa[i] * xb[j]; UNPROTECT(3); return(ab); } SEXP test001(SEXP a){ int n, m; n = INTEGER(GET_DIM(a))[0]; m = INTEGER(GET_DIM(a))[1]; printf("nrow of a : %d\n", n); printf("ncol of a : %d\n", m); return a; } SEXP Rdgesv01(SEXP A, SEXP b, SEXP info) { int i; long int n = INTEGER(GET_DIM(A))[0]; long int nrhs=1; long int incx=1; long int incy=1; long int piv[n]; SEXP tmpA, tmpb; PROTECT(tmpA = allocMatrix(REALSXP, n, n)); PROTECT(tmpb = allocVector(REALSXP, n)); long int nn = n*n; dcopy_(&nn, REAL(A), &incx, REAL(tmpA), &incy); dcopy_(&n, REAL(b), &incx, REAL(tmpb), &incy); //A[0]=1.; A[1]=3.; A[2]=1.; //A[3]=1.; A[4]=1.; A[5]=-2.; //A[6]=1.; A[7]=-3.;A[8]=-5.; //x[0]=3.; x[1]=1.; x[2]=-6.; //y[0]=0.; y[1]=0.; y[2]=0.; printf("N = %ld\n", n); dgesv_(&n, &nrhs, REAL(tmpA), &n, piv, REAL(tmpb), &n, INTEGER(info)); for(i=0; i