通过C+进行模拟;GSL通过R与之平行

通过C+进行模拟;GSL通过R与之平行,c,r,gsl,C,R,Gsl,在我的研究工作中,我使用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 = mea

在我的研究工作中,我使用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;
    }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空){
const gsl_rng_类型*T;
gsl_rng*r;
int i,j,n=10,nsim=20;
双d[n],输出[nsim];
双平均值=1,西格玛=0.1;
gsl_rng_env_setup();
T=gsl\u rng\u默认值;
r=gsl_rng_alloc(T);
对于(int i=0;i
但是我的C+GSL代码有点不对劲。我是C+GSL的新手。有什么帮助吗

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

因此,您的代码可能看起来像(仅相关部分):

double d[n],out[nsim];
...
对于(int i=0;i

因此,您的代码可能看起来像(仅相关部分):

double d[n],out[nsim];
...
对于(int i=0;i
double d[j]=均值+gsl\u随机高斯(r,σ)这会给您带来大量的编译器错误。这真的编译了吗?我非常怀疑,或者你的编译器是垃圾。@Lundin是的,你说得很对。确实有很多编译器错误,但我不知道如何更正它们。然后在发布问题时需要提及这一点,最好也发布给出错误的行以及错误是什么。
double d[j]=mean+gsl\u run\u gaussian(r,sigma)这会给您带来大量的编译器错误。这真的编译了吗?我非常怀疑,或者你的编译器是垃圾。@Lundin是的,你说得很对。确实有很多编译器错误,但我不知道如何更正它们。然后在发布问题时需要提及这一点,最好也发布哪一行出现了错误以及错误是什么。谢谢!在您的帮助下,我更正了
printfout
内容,但是编译'double d[j]=mean+gsl\u ran\u gaussian(r,sigma);`有什么想法吗?我将Cygwin与
gcc-Wall-std=c99 sim.c-lm-lgsl-lgslcblas-o sim
一起使用。John,请看我的添加,以向您展示代码应该是什么样子。John,现在请记住,在块内(介于
{
}
之间)类型的关键字(例如
int
double
)创建一个新变量。那是你的主要错误。很高兴能帮上忙。谢谢!在您的帮助下,我更正了
printfout
内容,但是编译'double d[j]=mean+gsl\u ran\u gaussian(r,sigma);`有什么想法吗?我将Cygwin与
gcc-Wall-std=c99 sim.c-lm-lgsl-lgslcblas-o sim
一起使用。John,请看我的添加,以向您展示代码应该是什么样子。John,现在请记住,在块内(介于
{
}
之间)类型的关键字(例如
int
double
)创建一个新变量。那是你的主要错误。很高兴能帮上忙。
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]);