通过 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]);
我在研究工作中使用 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]);