Poniżej znajduje się część kodu C, który napisałem. Funkcję foo
należy wywołać w R. Kod nadal powoduje awarię R, a ja zawęziłem problem do tej funkcji outer()
, która służy do obliczenia zewnętrznej sumy lub różnicy. Zwróć uwagę na tę część, która jest skomentowana: jeśli jej nie skomentuję, funkcja poprowadzi R do awarii , jeśli każda z tablic zawiera, powiedzmy, ponad 1000 punktów danych. Jeśli skomentuję to, mogę obliczyć zewnętrzną sumę/różnicę dla znacznie dłuższych tablic bez problemu (np. Ponad 100000 punktów danych na tablicę). Zastanawiam się, na czym polega problem ... Dziękuję!Kod C wywołany przez R zawiesza się
#include <R.h>
#include <Rmath.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void outer(double *x1, double *x2, int *n, int operation, double *output){
int i, j;
if(operation==1){
for(i=0; i<*n; i++){
for(j=0; j<*n; j++){
output[(*n)*i+j]=x1[j]+x2[i];
}
}
} else if(operation==2){
for(i=0; i<*n; i++){
for(j=0; j<*n; j++){
output[(*n)*i+j]=x1[j]-x2[i];
//Rprintf("%d ", (*n)*i+j); //<-----------HERE
}
}
}
}
void foo(double *x, double *y, int *npred, int *nsamp){
int oper=2;
double xouter[*nsamp], youter[*nsamp];
double outer_temp_x[(*nsamp)*(*nsamp)], outer_temp_y[(*nsamp)*(*nsamp)];
outer(x, x, nsamp, oper, &outer_temp_x[0]);
outer(y, y, nsamp, oper, &outer_temp_y[0]);
}
// Po kompilacji kodu, używam poniższy kod w R do wywołania funkcji:
dyn.load("foo.so")
x=as.matrix(rnorm(10000))
y=rlnorm(10000)
invisible(.C("foo",
x=as.double(as.vector(x)),
y=as.double(y),
npred=as.integer(ncol(x)),
nsamp=as.integer(length(y))
)
to wywala R dla mnie, z 'Rprintf' wykomentowane. –
Uh. To naprawdę dziwne. Próbowałem tego wiele razy, i to nie uległo awarii, gdy Rprintf został skomentowany. Pozwól mi spróbować ponownie. – Alex
Po prostu wypróbowałem to jeszcze raz. Działało bez problemu. Bardzo dziwne. – Alex