如何解决“ linspace”功能的RCPP代码:增量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 /(1e-5)+1),它返回一个长度为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;
}
解决方法
这已经作为Armadillo函数存在,可以调用。 (代码行在这里分成两行显示,它实际上是一行。)
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
>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。