Код Rcpp для функции «linspace»: длина вектора неверна при увеличении 1e-5

#r #rcpp #linspace

#r #rcpp #linspace

Вопрос:

Я хочу написать функцию типа «linspace» для создания равных интервальных векторов в R с помощью Rcpp. 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;
    }
  

Ответ №1:

Я думаю, это объясняет вещи:

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

Ответ №2:

Это уже существует как функция 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> 
  

Тем не менее, правильное получение выражений «index math» всегда является хорошим упражнением для отладки.