c - 阅读为 R 包编写的 C 代码。在哪里可以找到 RANDIN、UNIF、EPS 等的定义?

标签 c r api som

我有兴趣准确理解 R 包的 C 代码。但我遇到过 RANDINRANDOUTUNIFEPS 等代码(它们是宏吗?)我不知道在哪里可以找到实现/定义。

我在哪里可以找到这些大写“表达式”的代码(以及解释,如果有的话)?

一个例子是“class”R 包中的 VR_onlineSOM 函数。此函数有以下用 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;
}

最佳答案

是的,它们是在 class.c 的开头定义的一些宏和常量.

#define EPS 1e-4            /* relative test of equality of distances */
#define RANDIN  GetRNGstate()
#define RANDOUT PutRNGstate()
#define UNIF unif_rand()

关于c - 阅读为 R 包编写的 C 代码。在哪里可以找到 RANDIN、UNIF、EPS 等的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20151383/

相关文章:

c - 是否可以将指针从结构类型转换为扩展 C 中第一个结构类型的另一种结构类型?

r - 控制 R 中 xtable 输出的小数位数

r - 通过循环 rvest::follow_link() 函数来抓取链接的 HTML 网页

api - 是否有用于访问Chrome同步数据的API?

security - 使用 SSL 的基本身份验证是否足够安全?

api - 具有单个服务器的 OAuth 2.0

c - 如何继续循环程序直到输入 'y' 或 'n'

c - 使用链表进行循环调度

r - R 中的 Knn 回归

c - 链接头文件: Matlab Engine and OpenGL