向量的最后一个成员在Rcpp

时间:2018-12-25 22:10:29

标签: c++ r rcpp

我有一个向量:

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

。现在,我想从这个向量中得到另一个向量,该向量给出了连续成员之间的差异。对于最后一个值(ts [10]);差异将来自双“ T”。

代码如下:

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 :(得分:0)

最好从向量的尾部开始

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;
}

答案 1 :(得分:-1)

好的,我找到了解决方案。刚在“ ts”向量中输入了双“ T”。

open http://localhost:8000