【发布时间】:2015-05-08 17:55:30
【问题描述】:
我编写了以下 Rcpp 代码,它可以编译但没有给出预期的结果。
// [[Rcpp::export]]
RObject test_1 (Rcpp::NumericVector& x)
{
NumericVector x1;
if (x.size() < 5)
{
NumericVector x1(x.size()*3);
for (int ii = 0; ii < x.size(); ii++)
{
x1[ii] = sqrt(x[ii]);
}
}
else
{
NumericVector x1(x.size()*2);
for (int ii = 0; ii < x.size(); ii++)
{
x1[ii] = sqrt(x[ii]);
}
}
return x1;
}
x1,返回向量在 if 语句之外声明,返回向量 x1 的大小可以变化。但是如果我用它创建一个新对象的大小声明 NumericVector,但返回的 x1 是一个空向量。
以下代码有效:
// [[Rcpp::export]]
RObject test (const Rcpp::NumericVector& x)
{
NumericVector x1;
if (x.size() < 5)
{
NumericVector tmp(x.size()*3);
for (int ii = 0; ii < x.size(); ii++)
{
tmp[ii] = sqrt(x[ii]);
}
x1 = tmp;
}
else
{
NumericVector tmp(x.size()*2);
for (int ii = 0; ii < x.size(); ii++)
{
tmp[ii] = sqrt(x[ii]);
}
x1 = tmp;
}
return x1;
}
在这里我声明了 temp numericvector,然后将 x1 设置为该向量。
我前段时间做过,知道有一种方法可以在声明 NumericVector 后将其设置为特定大小,但我只是不记得如何了。
编辑:编辑代码和问题以显示在 if 语句之前返回向量大小是如何未知的。
【问题讨论】:
-
"(我知道示例中不是这种情况)" - 请用您的情况的代表性示例阐明您的问题。
-
我不知道
r,但我是从 C++ 的角度来看的。如果编译了这段代码,那么 RObject 应该有一个接受 NumericVector 的构造函数,以便正确复制返回值,并创建一个新的RObject。换句话说,代码不应该崩溃,因为我没有看到客户端(您的)代码中正在进行任何指针操作。 -
@Alvin 我对你的目标有点困惑——不管
x的大小,只有x1的第一个x.size()元素将被赋予值(sqrt(x[ii]))。在x.size() < 5的情况下,x1中的[x.size(), 3*x.size()-1]值范围将默认初始化为0,在x.size() >= 5的情况下,x1中的[x.size(), 2*x.size()-1]值范围将是默认初始化为0。对吗? -
目标是在 if 语句中将 x1 设置为特定大小。其他一切都是次要的。我可以用我喜欢的任何值填充 x1,但这并不重要,我只想将 x1 设置为特定大小,而不必创建 tmp 向量并将 x1 设置为等于该值。谢谢。