gpt4 book ai didi

在 [R] 函数中发现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:42 25 4
gpt4 key购买 nike

我是 C 语言的新手,但对 [R] 了如指掌。这个错误在 C 中可能是一个非常愚蠢的错误。

我的 C 代码执行内核平滑。

*当我注释掉最后一行代码时,我的函数起作用了:results[i] = v; *

这个调用杀死了 R:

new.y<-zsmooth2( x=c(0:80000), xpts=dat$V2, ypts=dat$V4, h=10000)

* 捕获段错误 *地址 0x1184f8000,导致“内存未映射”

回溯: 1: .C("kernel_smooth", as.double(x), as.double(ypts), as.double(xpts), as.integer(n), as.integer(nxpts), as.double(h) , 结果 = double(长度(xpts))) 2: zsmooth2(x = c(0:80000), xpts = dat$V2, ypts = dat$V4, h = 10000)

C 代码:

#include <R.h>
#include <Rmath.h>
#include <stdio.h>


void kernel_smooth(double *x, double *ypts, double *xpts, int *n, int *nxpts, double *h, double *results){
int i, j;

for(i = 0; i < *n; i++){

double nsum = 0;
double dsum = 0;

double z = x[i] + *h;
double y = x[i] - *h;

for(j = 0; j < *nxpts; j++){

if(xpts[j] < y){
continue;
}
if(xpts[j] > z){
break;
}
double d = (xpts[j] - i) / *h;
double r = dnorm(d, 0, 1, 0);
nsum += r * ypts[j];
dsum += r;
}
Rprintf("test:i %d\n", i);
double v = nsum / dsum;
Rprintf("test:v %f\n", v);

results[i] = v;
}

}

R 代码:

 dyn.load("~/github/ZevRTricks/smoother1.so")
zsmooth2<-function(x, ypts, xpts, h){
n <- length(x)
nxpts <- length(xpts)
dens <- .C("kernel_smooth", as.double(x), as.double(ypts),
as.double(xpts), as.integer(n), as.integer(nxpts),
as.double(h), result = double(length(xpts)))
dens[["result"]]
}

最佳答案

xptsypts 是 vector ,在您的 C 代码中,您试图访问其中每个元素中的元素 1 到 nnx 的长度,第二个示例中的长度是第一个示例中的 100 倍。将 seq(from = 0, to = 80000 by = 100)0:80000 进行比较,(当你这样做时,你可以删除 c( )0:80000 开始。

所以我猜 xptsypts 至少有 801 个元素长,但少于 80001 个元素。你在某处搞砸了你的索引。

另请注意,您将 x 传递给您的 C 代码,但实际上并未将其用于任何用途。

关于在 [R] 函数中发现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9487206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com