R パッケージの C コードを正確に理解することに興味があります。しかし、実装/定義がどこにあるのかわからない 、 、 など (マクロですか?) などRANDIN
のRANDOUT
コードに出くわしました。UNIF
EPS
これらの大文字の「式」のコード (および説明がある場合) はどこにありますか?
例は、VR_onlineSOM
'class' R パッケージ内の関数です。この関数には、C で記述された次のコードがあります。
void
VR_onlineSOM(double *data, double *codes, double *nhbrdist,
double *alpha, double *radii,
Sint *pn, Sint *pp, Sint *pncodes, Sint *rlen)
{
int n = *pn, p = *pp, ncodes = *pncodes;
int i, j, k, nearest = 0 /* -Wall */, nind;
double dm, dist, tmp;
unsigned int cd; /* avoid spurious warning from gcc pre-4.3.0 */
RANDIN;
for (k = 0; k < *rlen; k++) {
/* pick a random data point */
i = (int)(n * UNIF);
/* find the nearest code 'near' */
nind = 0; dm = DOUBLE_XMAX;
for (cd = 0; cd < ncodes; cd++) {
dist = 0.0;
for (j = 0; j < p; j++) {
tmp = data[i + j*n] - codes[cd + j*ncodes];
dist += tmp * tmp;
}
if (dist <= dm * (1 + EPS)) {
if (dist < dm * (1 - EPS)) {
nind = 0;
nearest = cd;
} else {
if(++nind * UNIF < 1.0) nearest = cd;
}
dm = dist;
}
/* update all codes within radii[k] of 'nearest' */
for (cd = 0; cd < ncodes; cd++) {
if(nhbrdist[cd + ncodes*nearest] > radii[k]) continue;
for(j = 0; j < p; j++)
codes[cd + j*ncodes] += alpha[k] *
(data[i + j*n] - codes[cd + j*ncodes]);
}
}
}
RANDOUT;
}