Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ R使用带有NA输入的Rcpp进行崩溃/中止_C++_R_Rstudio_Rcpp_Na - Fatal编程技术网

C++ R使用带有NA输入的Rcpp进行崩溃/中止

C++ R使用带有NA输入的Rcpp进行崩溃/中止,c++,r,rstudio,rcpp,na,C++,R,Rstudio,Rcpp,Na,我想处理两个光栅图像(Ra和Rb),Ra是像素值本身,Rb是相邻像素的值。以sum为例,假设一个3*3的邻域,对于Ra中的每个像素,我将把它的值加到Rb中的邻域像素的值上,最后我将得到另一幅图像 > R光栅包提供了一个焦点函数,它只对一个图像输入进行工作,我尝试修改C++代码()以接受两个图像输入使用RCPP。如果Rb的输入图像中没有缺失值,则修改后的代码可以正常工作。但是,如果Rb中有NA,R总是中止。具体来说,在第二次或第三次测试时中止。它可能类似于。但是,如果输入Rb中没有NA,则不会崩

我想处理两个光栅图像(Ra和Rb),Ra是像素值本身,Rb是相邻像素的值。以sum为例,假设一个3*3的邻域,对于Ra中的每个像素,我将把它的值加到Rb中的邻域像素的值上,最后我将得到另一幅图像

<> > R光栅包提供了一个焦点函数,它只对一个图像输入进行工作,我尝试修改C++代码()以接受两个图像输入使用RCPP。如果Rb的输入图像中没有缺失值,则修改后的代码可以正常工作。但是,如果Rb中有NA,R总是中止。具体来说,在第二次或第三次测试时中止。它可能类似于。但是,如果输入Rb中没有NA,则不会崩溃。似乎我没有正确处理NA。我对C++没有很深的了解,有人能帮我查一下吗? 这是我的cpp文件:

#include <Rcpp.h>
#include <R.h>
#include <Rinternals.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <Rmath.h>
#include "Rdefines.h"
#include "R_ext/Rdynload.h"

using namespace Rcpp;
// [[Rcpp::export]]
NumericVector focal_quantile(NumericVector xd, int ngbb, NumericVector sf) {
  //the imges are transfered to vector, ngbb is the size of the window  
  R_len_t i, j, k, q;
  int wrows = ngbb;
  int wcols = ngbb;
  int wn = wrows * wcols;

  int nrow = 6;//the input raste has 6 rows
  int ncol = 7;//the input raste has 7 cols

  int n = nrow * ncol;
  NumericVector xans(n);
  NumericVector xx(wn);

  int wr = floor(wrows / 2);
  int wc = floor(wcols / 2);

  int nwc = ncol - wc - 1;
  int col = 0;

  // first rows
  for (i = 0; i < ncol*wr; i++) {// the first row, the resutl is set as NA as the neighbor does not have nine values   
    xans[i] = R_NaReal; 
  }

  for (i = ncol*wr; i < (ncol * (nrow-wr)); i++) {//start from the second row
    col = i % ncol;
    if ((col < wc) | (col > nwc)) {//the first pixel of the second is also set as NA
      xans[i] = R_NaReal;
    } else {// to get the nine values in the 3*3 windows
      q = 0;
      for (j = -wr; j <= wr; j++) {
        for (k = -wc; k <= wc; k++) {
          xx[q] = xd[j * ncol + k + i]; 
          q++;
        }
      }
      xx = na_omit(xx);
      int n_qt = xx.size();
      if (n_qt > 0){//
        xans[i]=sum(xx)+100*sf[i];// here is the calculation, my goal is more complicated than this example
      } else {
        xans[i] = R_NaReal;//R_NaReal
      }

    }
  }
  // last rows
  for (i = ncol * (nrow-wr); i < n; i++) {  
    xans[i] = R_NaReal;
  }
  return(xans);
}
示例结果

 [1]       NA       NA       NA       NA       NA       NA       NA       NA 118918.6 130810.5 142702.3 154594.2 166486.0       NA       NA
[16] 202161.6 214053.5 225945.3 237837.2 249729.1       NA       NA 285404.7 297296.5 309188.4 321080.2 332972.1       NA       NA 368647.7
[31] 380539.5 392431.4 404323.3 416215.1       NA       NA       NA       NA       NA       NA       NA       NA
结果NA是可接受的,因为窗口中没有九个值。 例如,我更改了光栅rr的值(不带NA)。它工作顺利。当我在rr中引入NA时,例如上面代码的第六行。全局环境窗口正在刷新,Rstudio中止

会话信息是

R version 3.3.0 (2016-05-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Rcpp_0.12.11 raster_2.5-8 sp_1.2-3    

loaded via a namespace (and not attached):
[1] rgdal_1.2-5     tools_3.3.0     grid_3.3.0      lattice_0.20-35

多谢各位

首先,您应该只使用
#include
语句。您正在添加的其他标题不需要,或者已经包含在
Rcpp.h


其次,在Rcpp中引用
NumericVector
s的
NA
值的正确方法是使用
NA_REAL
notR的
R_NaReal


第三,您有一个越界错误。如果将括号从
[]
切换到
()
,则有边界检测。Rcpp 0.12.11上的错误为:

“索引超出范围:[索引=3;范围=3]。”

因此,这会创建一个触发RStudio崩溃的事件

问题在于:

xx(q) = xd(j * ncol + k + i); 
^^^^^
现在,您可能会说这没有意义,因为
xx
的长度永远不应该是3。但是,此行出现问题的原因是,当您将
NA
值与以下内容一起删除时,您正在更改
xx
中的值:

xx = na_omit(xx);
如果这是目标,您应该声明一个新的
xy
向量,或者更新常量以确保避免越界错误


实施 输出:

 [1]        NA        NA        NA        NA        NA        NA        NA        NA  742.5581  915.8140 1099.0698 1292.3256
[13] 1375.5814        NA        NA 1625.3488 1828.6047 2041.8605 2265.1163 2378.3721        NA        NA 2718.1395 2831.3953
[25] 2944.6512 3057.9070 3171.1628        NA        NA 3510.9302 3624.1860 3737.4419 3850.6977 3963.9535        NA        NA
[37]        NA        NA        NA        NA        NA        NA

旁注


如果您查看要翻译的代码,请注意有一部分后面跟着na组件。因此,翻译不一定是1-1

首先,您应该只使用
#include
语句。您正在添加的其他标题不需要,或者已经包含在
Rcpp.h


其次,在Rcpp中引用
NumericVector
s的
NA
值的正确方法是使用
NA_REAL
notR的
R_NaReal


第三,您有一个越界错误。如果将括号从
[]
切换到
()
,则有边界检测。Rcpp 0.12.11上的错误为:

“索引超出范围:[索引=3;范围=3]。”

因此,这会创建一个触发RStudio崩溃的事件

问题在于:

xx(q) = xd(j * ncol + k + i); 
^^^^^
现在,您可能会说这没有意义,因为
xx
的长度永远不应该是3。但是,此行出现问题的原因是,当您将
NA
值与以下内容一起删除时,您正在更改
xx
中的值:

xx = na_omit(xx);
如果这是目标,您应该声明一个新的
xy
向量,或者更新常量以确保避免越界错误


实施 输出:

 [1]        NA        NA        NA        NA        NA        NA        NA        NA  742.5581  915.8140 1099.0698 1292.3256
[13] 1375.5814        NA        NA 1625.3488 1828.6047 2041.8605 2265.1163 2378.3721        NA        NA 2718.1395 2831.3953
[25] 2944.6512 3057.9070 3171.1628        NA        NA 3510.9302 3624.1860 3737.4419 3850.6977 3963.9535        NA        NA
[37]        NA        NA        NA        NA        NA        NA

旁注


如果您查看要翻译的代码,请注意有一部分后面跟着na组件。因此,翻译不一定是1-1

无袖,非常感谢您的宝贵帮助。我犯了一个多么简单的错误啊。我以后会加倍小心的。在我这边,我处理所有的数据,而不是仅仅处理数据。再次感谢你。科特勒,非常感谢你的宝贵帮助。我犯了一个多么简单的错误啊。我以后会加倍小心的。在我这边,我处理所有的数据,而不是仅仅处理数据。再次感谢你。