【发布时间】:2019-12-19 21:51:18
【问题描述】:
我正在尝试在 Rcpp 中重写 R 函数(傅立叶平滑)以加快计算速度。我的 Rcpp 函数没有返回所需的值。
我有一个向量
x = c(6262, 5862.5, 5463, 5408, 5353, 5687, 5901, 6245, 5864, 5483, 5692, 5708.5, 5054.75, 5072.375, 5090, 5462, 4939, 5248.5, 5558, 5226, 5125, 5006, 4887, 5334.5, 5782, 5501, 5524.5, 5548)
我的 Rcpp 函数
cppFunction("
NumericVector smo(NumericVector x){
int n = x.size();
NumericVector realpart1(5);
NumericVector imagpart1(5);
NumericVector sm1(n);
for (int i = 0; i<5; i++){
double realpart = 0;
double imagpart = 0;
for (int j = 0; j<n; j++) {
realpart = realpart + 0.07142857*x[j]*cos(2 * 3.142857 * (i+1-1) * (j+2)/28);
imagpart = imagpart + 0.07142857 * x[j] * sin(2 * 3.142857 * (i+1 - 1) * (j+2) /28);
}
realpart1[i]=realpart;
imagpart1[i] = imagpart;
}
for (int j = 0; j<n; j++){
double sm = realpart1[0]/2;
for (int i=0; i<5; i++){
sm = sm + realpart1[i]*cos(2 * 3.142857 * (i+1 - 1) * (j+2) / 28) + imagpart1[i]*sin(2 * 3.142857 * (i+1-1) * (j+2) / 28);
}
sm1[j] = sm;
}
return sm1;
}
")
函数 smo 的输出如下所示
16804.81 16674.97 16518.58 16425.55 16453.36 16594.95 16780.77 16914.47
16922.49 16789.76 16563.30 16324.47 16147.96 16070.53 16083.19 16145.65
16210.29 16241.81 16226.19 16170.64 16099.70 16049.52 16058.45 16152.36
16328.20 16545.64 16736.58 16833.36
如果我从function(smo) 的输出中减去值10949.12,我将得到如下所示的预期结果
期望的输出
5855.689 5725.846 5569.459 5476.428 5504.237 5645.833 5831.647 5965.351
5973.369 5840.640 5614.181 5375.346 5198.844 5121.412 5134.069 5196.534
5261.174 5292.694 5277.066 5221.517 5150.584 5100.398 5109.330 5203.243
5379.080 5596.524 5787.462 5884.235
10949.12的值是NumericVector realpart1的第一个值
我无法解决此问题,因为我是第一次尝试 Rcpp。我已经多次检查循环,直到 realpart1 和 imagpart1 循环的计算工作正常......第二个循环有一些问题,但我无法弄清楚为什么值 10949.12 是在输出中添加。
我将非常感谢这方面的任何帮助。
等效的 R 代码
har = 4
pi = 22/7
realpart1 = c()
imagpart1 = c()
for (p in 1:(har+1)){
realpart = 0
imagpart = 0
for (i in 1:length(x)){
realpart = realpart + (2 /length(x)) * x[i] * cos(2 * pi * (p - 1) * (i+1) / length(x))
imagpart = imagpart + (2 / length(x)) * x[i] * sin(2 * pi * (p - 1) * (i+1) / length(x))
}
realpart1 = c(realpart1,realpart)
imagpart1 = c(imagpart1,imagpart)
#print(realpart)
#print(imagpart)
}
sm1 = c()
for (i in 1:length(x)){
sm = realpart1[1]/2
for (p in 2:(har+1)){
sm = sm + realpart1[p]*cos(2 * pi * (p - 1) * (i+1) / length(x))+ imagpart1[p]*sin(2 * pi * (p - 1) * (i+1) / length(x))
}
sm1 = c(sm1,sm)
}
【问题讨论】:
-
您能向我们展示 R 中的工作实现吗?顺便说一句,第二个 for 循环中的嵌套 for 循环可能应该缩进。
-
好的...我正在发布 R 代码...
-
第二个 for 循环中的嵌套 for 循环在 R 中从 2 到 5,但在 C++ 中从 0 到 4 等效于 R 版本。它应该在 C++ 中从 1 变为 4。顺便说一句,你为什么要重新定义
pi?为什么要在 R 中动态增长向量? -
实际上,我是从 VB 中复制这段代码的,这就是为什么我以 VB 中的方式编写它的原因。我知道 R 中动态增长的值会很慢。有什么建议可以避免吗???
-
感谢您指出从 2 开始的循环。谢谢这解决了我的问题...