向量的最后一个成员在 Rcpp 中没有给出正确的结果
Last member of vector does not give proper result in 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;
}
")
,它仍然给了我错误的结果。
最好从向量的尾部开始
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;
}
好的,我找到了解决方案。刚刚在"ts"向量中输入了双"T"。
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;
}
")
相关文章:
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 当在另一个范围中,将SelfAdjointeigensolver保存为成员的结果被重新引入
- 如何修改 std::generate 的绑定成员函数的结果
- 是否可以将类成员变量设置为类函数的结果?
- 多态性:成员访问和吸气器给出不同的结果
- 为什么 G++ 不警告 const 成员的未使用结果?
- 只有当声明一个对象时,内存空间才会分配给类的数据成员,那么为什么 Sizeof(class_name) 给我结果
- 向量的最后一个成员在 Rcpp 中没有给出正确的结果
- 如何在未评估的上下文中将成员函数的结果类型应用于类成员
- std::具有自定义比较函数结果的排序函数错误:必须调用对非静态成员函数的引用
- 将cv::Mat A的每个成员与cv::Mat B合并,以创建一个cv::Mat C,结果为[A(x,y),B(x,y)
- 返回成员变量时,为什么函数内外得到的结果不同
- 将重载+成员函数的结果发送到重载<<导致编译错误
- 使用函数调用结果在C++03中初始化多个成员
- C++成员函数结果缓存实现
- 将 std::forward_as_tuple() 结果传递给可能从该对象的 rvalue-reference 成员移动的多个函数?
- 重载成员函数访问元组和递归累加结果失败的原因
- 如何用函数的结果初始化静态成员数组
- 是否有可能将一个动作附加到boost::spirit::规则解析器,该解析器将解析结果分配给(尚未)未知实例的成员
- 如何仅使用元素成员函数和STL在容器中积累来自元素成员函数的结果