gpt4 book ai didi

c++ - Rcpp 数值 vector 输出只返回一个值

转载 作者:行者123 更新时间:2023-11-30 02:53:26 30 4
gpt4 key购买 nike

因此,我在从使用 RCPP 创建的函数返回值时遇到了一些问题。它只返回 NumericVector 的第一个值。问题是当我在自身内部调用函数并将 NumericVector 传递回 out 变量时。任何关于我做错了什么的意见都将不胜感激。

NumericVector advantage(double tRos, double tTat, double cRos, double cTat){
double tRosAd = 0;
double tTatAd = 0;
double ja = 0;
double rosAtt = 0;
double tatAtt = 0;
double ttlAd = 0;
NumericVector out(1);

if ((tRos >= 0 || cRos >=0) && cRos >= tRos && cTat <= tTat){
//case 1.1//
tRosAd = (cRos - tRos) * cTat * -1;
tTatAd = (tTat - cTat) * tRos;
out[0] = tRosAd;
out[1] = tTatAd;
}
else if((tRos >= 0 && cRos >= 0) && cRos <= tRos && cTat >= tTat){
//case 1.2//
out = advantage(cRos, cTat, tRos, tTat);
out[0] = out[0] * -1;
out[1] = out[1] * -1;
}
else if(tRos >= 0 && cRos <= 0 && tTat >= cTat){
//case 2.1//
tRosAd = (tRos - cRos) * cTat;
tTatAd = (tTat - cTat) * tRos;
out[0] = tRosAd;
out[1] = tTatAd;
}
else if(tRos <= 0 && cRos >= 0 && tTat <= cTat){
//case 2.2//
out = advantage(cRos, cTat, tRos, tTat);
out[0] = out[0] * -1;
out[1] = out[1] * -1;
}
else if(tRos <= 0 && cRos <= 0 && tTat >= cTat & tRos >= cRos){
//case 3.1//
tRosAd = (tRos - cRos) * cTat;
tTatAd = (tTat - cTat) * tRos;
out[0] = tRosAd;
out[1] = tTatAd;
}
else if(tRos <= 0 && cRos <= 0 && tTat <= cTat && tRos <= cRos){
//case 3.2//
out = advantage(cRos, cTat, tRos, tTat);
out[0] = out[0] * -1;
out[1] = out[1] * -1;
}
else if(tRos >= 0 && cRos >= 0 && tTat >= cTat && tRos >= cRos){
//case 4.1//
//calculate two attribution advantages//
tRosAd = (tRos - cRos) * cTat;
tTatAd = (tTat - cTat) * cRos;
//calculate total & joint advantage//
ttlAd = (tTat * tRos) - (cTat * cRos);
ja = ttlAd - (tRosAd + tTatAd);
rosAtt = tRosAd / (tRosAd / tTatAd);
tatAtt = tTatAd / (tRosAd / tTatAd);
//add joint advantage//
tRosAd = ja * rosAtt + tRosAd;
tTatAd = ja * tatAtt + tTatAd;
out[0] = tRosAd;
out[1] = tTatAd;
}
else if(tRos >= 0 && cRos >= 0 && tTat <= cTat && tRos <= cRos){
//case 4.2//
out = advantage(cRos, cTat, tRos, tTat);
out[0] = out[0] * -1;
out[1] = out[1] * -1;
}
else if(tRos <= 0 && cRos <= 0 && tTat <= cTat && tRos >= cRos){
//case 5.1//
tRosAd = (tRos - cRos) * tTat;
tTatAd = (cTat - tTat) * tRos * -1;
//calculate total and joint advantage//
ttlAd = (tTat * tRos) - (cTat * cRos);
ja = ttlAd - (tRosAd + tTatAd);
rosAtt = tRosAd / (tRosAd + tTatAd);
tatAtt = tTatAd / (tRosAd + tTatAd);
tRosAd = ja * rosAtt + tRosAd;
tTatAd = ja * tatAtt + tTatAd;
out[0] = tRosAd;
out[1] = tTatAd;
}
else if(tRos <= 0 && cRos <= 0 && tTat >= cTat && tRos <= cRos){
//case 5.2//
out = advantage(cRos, cTat, tRos, tTat);
out[0] = out[0] * -1;
out[1] = out[1] * -1;
}
return out;
}

最佳答案

正如 Hadley 的评论所述,NumericVector out(1) 创建了一个长度为 1 的新实例。

您很幸运,当您访问通过 out[0]out[1] 重复的两个元素时,代码没有崩溃。

如果您知道 vector 的长度 n,请使用它:NumericVector out(n)。否则稍后调整大小可能会丢失您的内容。

如果您不知道 vector 的长度,请动态增长 std::vector 并在返回到 R 时进行转换。这两种方法都有很多示例。

关于c++ - Rcpp 数值 vector 输出只返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18024284/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com