"linspace" 函数的 Rcpp 代码:增量 1e-5 时向量长度不正确
Rcpp code for "linspace" function: vector length incorrect when increment 1e-5
我想编写一个像“linspace”这样的函数来使用 Rcpp 在 R 中创建等间隔向量。 num_dis 这里是我想要的那个向量的间隔数,即 a=0,b=10,num_dis = (10-0)/(1e-5)+1=1000001。当我输入 linspace(0,10,1000001) 时,向量长度正确为 1000001;但是,当我这样写时:linspace(0,10,10/(1e-5)+1),它 returns 一个长度为 100000 的向量。对于像 1e-3,1e-6 等增量,看起来不错。我不太确定会发生什么?
NumericVector linspace(double a,double b,int num_dis) {
NumericVector u(num_dis);
for (int i = 0; i < num_dis; i++) {
u[i] = a + i * ((b - a) / (num_dis-1));
}
return u;
}
这已经作为您可以调用的犰狳函数存在。 (这里代码行分两行显示,真的是一行。)
R> Rcpp::cppFunction("arma::vec ls(double s, double e, int N) {
return arma::linspace(s, e, N); }", depends="RcppArmadillo")
R> ls(1,2, 10)
[,1]
[1,] 1.00000
[2,] 1.11111
[3,] 1.22222
[4,] 1.33333
[5,] 1.44444
[6,] 1.55556
[7,] 1.66667
[8,] 1.77778
[9,] 1.88889
[10,] 2.00000
R>
也就是说,正确使用“索引数学”表达式始终是一个很好的调试练习。
我认为这可以解释事情:
> as.integer(10/(1e-5)+1)
[1] 1000000
> as.integer(10L*1e5L+1L)
[1] 1000001
>
我想编写一个像“linspace”这样的函数来使用 Rcpp 在 R 中创建等间隔向量。 num_dis 这里是我想要的那个向量的间隔数,即 a=0,b=10,num_dis = (10-0)/(1e-5)+1=1000001。当我输入 linspace(0,10,1000001) 时,向量长度正确为 1000001;但是,当我这样写时:linspace(0,10,10/(1e-5)+1),它 returns 一个长度为 100000 的向量。对于像 1e-3,1e-6 等增量,看起来不错。我不太确定会发生什么?
NumericVector linspace(double a,double b,int num_dis) {
NumericVector u(num_dis);
for (int i = 0; i < num_dis; i++) {
u[i] = a + i * ((b - a) / (num_dis-1));
}
return u;
}
这已经作为您可以调用的犰狳函数存在。 (这里代码行分两行显示,真的是一行。)
R> Rcpp::cppFunction("arma::vec ls(double s, double e, int N) {
return arma::linspace(s, e, N); }", depends="RcppArmadillo")
R> ls(1,2, 10)
[,1]
[1,] 1.00000
[2,] 1.11111
[3,] 1.22222
[4,] 1.33333
[5,] 1.44444
[6,] 1.55556
[7,] 1.66667
[8,] 1.77778
[9,] 1.88889
[10,] 2.00000
R>
也就是说,正确使用“索引数学”表达式始终是一个很好的调试练习。
我认为这可以解释事情:
> as.integer(10/(1e-5)+1)
[1] 1000000
> as.integer(10L*1e5L+1L)
[1] 1000001
>