Dưới đây là một phần của mã C tôi đã viết. Hàm foo
sẽ được gọi bằng R. Mã giữ nguyên R bị lỗi và tôi đã thu hẹp sự cố xuống hàm outer()
này, được sử dụng để tính toán tổng hoặc khác biệt bên ngoài. Lưu ý phần được nhận xét ra: Nếu tôi không bình luận nó ra, chức năng sẽ dẫn R sụp đổ nếu mỗi mảng có chứa, nói rằng, hơn 1000 điểm dữ liệu. Nếu tôi nhận xét nó ra, tôi có thể tính toán tổng hợp/chênh lệch bên ngoài cho các mảng dài hơn đáng kể mà không có vấn đề gì (ví dụ: trên 100000 điểm dữ liệu cho mỗi mảng). Tôi tự hỏi vấn đề là gì ... Cảm ơn bạn!Mã C được gọi bằng R giữ lỗi
#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]);
}
// Sau khi biên dịch mã, tôi sử dụng mã dưới đây vào R để gọi hàm:
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))
)
này bị treo R đối với tôi, với 'Rprintf' nhận xét ra. –
Uh. Thật kỳ quặc. Tôi đã thử nó nhiều lần, và nó đã không sụp đổ R khi Rprintf được nhận xét. Để tôi thử lại lần nữa .. – Alex
Chỉ cần thử lại lần nữa. Nó hoạt động không có vấn đề gì. Thật kỳ lạ. – Alex