Последний член вектора не дает должного результата в Rcpp - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть вектор с именем:

ts<- c(1.061786, 1.201682, 1.265509, 1.372124, 1.572853, 1.629114, 1.660798, 1.898390, 1.908208, 1.944675)

.Теперь я хочу сделать еще один вектор из этого, который дает разницу между последовательными членами.И для последнего значения (тс [10]);разница будет от двойной буквы "Т".

Код выглядит следующим образом:

cppFunction("
 std::vector<double> res (std::vector<double> ts, double T ){

          std::vector<double> newts(ts.size()+1);
          newts[0]=0.0;
          for(int j=1; j<=ts.size(); j++){
            if(j< ts.size()){
            newts[j]= ts[j]-ts[j-1];
            }
             else if (j== ts.size()){
            newts[j]= T -ts[j];
             }
             else{
                newts[j]=0.0;
             }
          }

        return newts;
        }
        ")

.Фактический результат для res (ts, T = 2) должен быть следующим:

    [1] 0.000000000 0.139895661 0.063826732 0.106615236 0.200729464 0.056260681 0.031683749 0.237591892
    [9] 0.009818105 0.036467479 0.05532473

.Но это дает мне результат:

 [1] 0.000000000 0.139895661 0.063826732 0.106615236 0.200729464 0.056260681 0.031683749 0.237591892
 [9] 0.009818105 0.036467479 2.000000000

То есть последний член нового вектора неверен.Почему это происходит?Любое предложение?

Редактировать

Даже если я использую следующий код:

cppFunction("
 std::vector<double> res (std::vector<double> ts, double T ){

          std::vector<double> newts(ts.size()+1);

          for(int j=0; j<=ts.size(); j++){
            if(j==0){
              newts[j]=0.0;
            }
            else if(j< ts.size()){
            newts[j]= ts[j]-ts[j-1];
            }
             else if (j== ts.size()){
            newts[j]= T -ts[j];
             }
             else{
                newts[j]=0.0;
             }
          }

        return newts;
        }
        ")

, он все равно дает мне неправильный результат.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Лучше начать с хвоста вектора

std::vector<double> res(std::vector<double> ts, double T) {

    std::vector<double> newts(ts.size() + 1);
    newts[0] = 0.0;
    int n = ts.size();
    for (int j = n - 1; j > 0; j--) {
        newts[j] = ts[j] - ts[j - 1];
    }

    newts[newts.size() - 1] = T - ts[n - 1];

    return newts;
}

А вот и производная программа

int main() {
    std::vector<double> ts{ 1.061786, 1.201682, 1.265509, 1.372124, 1.572853, 1.629114, 1.660798, 1.898390, 1.908208, 1.944675 };
    double T = 2;
    std::vector<double> result = res(ts, T);

    for (auto x : result)
        std::cout << x << "\n";

    return 0;
}
0 голосов
/ 26 декабря 2018

Хорошо, я нашел решение.Только что вошел в двойную букву "T" внутри вектора "ts".

cppFunction("
 std::vector<double> res (std::vector<double> ts, double T ){

          std::vector<double> newts(ts.size()+1);
          newts=ts;
          newts.insert(newts.end(),T);
          std::vector<double> nnewts(newts.size());
          for(int j=0; j<newts.size(); j++){
            if(j==0){
              nnewts[j]=0.0;
            }
            else if(j< newts.size()){
            nnewts[j]= newts[j]-newts[j-1];
            }

             else{
                nnewts[j]=0.0;
             }
          }

        return nnewts;
        }
        ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...