【问题标题】:Rcpp code for "linspace" function: vector length incorrect when increment 1e-5“linspace”函数的 Rcpp 代码:增量 1e-5 时向量长度不正确
【发布时间】:2020-10-22 06:32:55
【问题描述】:

我想编写一个类似“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),它返回一个长度为 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 linspace


    【解决方案1】:

    我认为这说明了一些事情:

    > as.integer(10/(1e-5)+1)
    [1] 1000000
    > as.integer(10L*1e5L+1L)
    [1] 1000001
    > 
    

    【讨论】:

      【解决方案2】:

      这已经作为您可以调用的犰狳函数存在。 (代码行这里分两行显示,确实是一行。)

      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> 
      

      也就是说,正确的“索引数学”表达式总是一个很好的调试练习。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        • 1970-01-01
        • 2020-01-20
        相关资源
        最近更新 更多