首页 > 解决方案 > 向量的最后一个成员在 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;
        }
        ")

,它仍然给我错误的结果。

标签: c++rrcpp

解决方案


最好从向量的尾部开始

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

推荐阅读