通过 C+GSL 模拟与通过 R 并行模拟

Simulation via C+GSL parallel with that via R

我在研究工作中使用 R 进行仿真。 最近,出于速度原因,我转向 C+GSL。 为了说明,我先写一些 通过 R 的简单代码如下。

    n = 10
    nsim = 20
    out = array(0,c(nsim,1))
    set.seed(123) # for reproducibility
    for (i in 1:nsim){
        d = rnorm(n, mean=1, sd=0.1) # generate data
        m = mean(d)
        out[i] = m
    }
    print(out)

然后我尝试用C+GSL做同样的事情,就是

    #include <stdio.h>
    #include <stddef.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #include <gsl/gsl_vector.h>
    #include <gsl/gsl_matrix.h>
    #include <gsl/gsl_blas.h>
    #include <gsl/gsl_linalg.h>
    #include <gsl/gsl_rng.h>
    #include <gsl/gsl_randist.h>
    #include <gsl/gsl_statistics.h>

    int main(void){
        const gsl_rng_type * T;
        gsl_rng * r;

        int i, j, n=10, nsim=20;
        double d[n], out[nsim];
        double mean = 1, sigma = 0.1;

        gsl_rng_env_setup();
        T = gsl_rng_default;
        r = gsl_rng_alloc (T);

        for (int i = 0; i < nsim; i++) {
            for (j = 0; j < n; j++) {
                double d[j] = mean + gsl_ran_gaussian(r, sigma);
                // printf (" %f", x);
            }
            double out[i] = gsl_stats_mean(d, 1, n);    
        }   
    printf ("The output is %g\n", out);
    gsl_rng_free (r);
    return 0;
    }

但是我的 C+GSL 代码有些地方是错误的。我对 C+GSL 很陌生。有帮助吗?

for (j = 0; j < n; j++) {
    double d[j] = mean ...

此关键字 double 现在声明一个 新的 数组 d 的双倍大小 j。那不是你想要的;您已经声明了您的数组:在此处删除关键字 double

同时在 double out[i] = ...

中删除关键字 double

注意在printf ("The output is %g\n", out);out是一个数组,但是不能一次打印一个数组;你必须打印它 one-by-one,比如:

for (int i = 0; i < nsim; i++)
    printf ("%g\n", out[i]);


所以你的代码看起来像(只有相关部分):

    double d[n], out[nsim];
    ...
    for (int i = 0; i < nsim; i++) {
        for (j = 0; j < n; j++) {
            d[j] = mean + gsl_ran_gaussian(r, sigma);
        }
        out[i] = gsl_stats_mean(d, 1, n);    
    }   
    for (int i = 0; i < nsim; i++)
        printf ("%g\n", out[i]);