通过C+进行模拟;GSL通过R与之平行
在我的研究工作中,我使用R进行模拟。 最近,出于速度原因,我转向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
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;idouble 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]);