4 #define ROOT2PI 2.50662827463100050241
11 static double kernel(x
, y
, w
, type
)
23 if (-0.5 < z
&& z
< 0.5) {
24 z
= (1.0 - 4 * z
* z
);
25 k
= 15.0 * z
* z
/ 8.0;
32 k
= exp(- 0.5 * z
* z
) / ROOT2PI
;
37 k
= (fabs(z
) < 0.5) ? 1.0 : 0.0;
40 if (-1.0 <= z
&& z
< 0.0) k
= 1.0 + z
;
41 else if (0.0 <= z
&& z
< 1.0) k
= 1.0 - z
;
44 default: k
= 0.0; break;
53 kernel_smooth(x
, y
, n
, width
, wts
, wds
, xs
, ys
, ns
, ktype
)
54 double *x
, *y
, width
, *wts
, *wds
, *xs
, *ys
;
58 double wsum
, ysum
, lwidth
, lwt
, xmin
, xmax
;
63 for (xmin
= xmax
= x
[0], i
= 1; i
< n
; i
++) {
64 if (xmin
> x
[i
]) xmin
= x
[i
];
65 if (xmax
< x
[i
]) xmax
= x
[i
];
67 width
= (xmax
- xmin
) / (1 + log((double) n
));
70 for (i
= 0; i
< ns
; i
++) {
71 for (j
= 0, wsum
= 0.0, ysum
= 0.0; j
< n
; j
++) {
72 lwidth
= (wds
!= nil
) ? width
* wds
[j
] : width
;
73 lwt
= kernel(xs
[i
], x
[j
], lwidth
, ktype
);
74 if (wts
!= nil
) lwt
*= wts
[j
];
76 if (y
!= nil
) ysum
+= lwt
* y
[j
];
78 if (y
!= nil
) ys
[i
] = (wsum
> 0.0) ? ysum
/ wsum
: 0.0;
79 else ys
[i
] = wsum
/ n
;