0

我在 Rcpp 中创建了一个双 for 循环,以便在下一个可用单元格中有 5 的列中向上移动一个单元格,所有 1 都为 1。当我编译代码时,我没有收到任何错误,但代码确实在矩阵中移动了 1,它只返回相同的矩阵。让我们取一个原始矩阵,比如命名为 t:

5    1    1    1    1
1    5    5    5    1
5    5    1    5    5
5    0    0    5    1
5    5    0    1    1

运行代码 up_rcpp(t,5,5) 后,我应该得到以下结果

    1    5    1    1    1
    5    5    1    5    1
    5    5    5    5    1
    5    0    0    5    5
    5    1    0    1    1

下面是我的rcpp代码:

 #include <Rcpp.h>

using namespace Rcpp;

//[[Rcpp::export]]

Rcpp::NumericMatrix up_rcpp(Rcpp::NumericMatrix main, int r, int c) {
  

 Rcpp::NumericMatrix t = clone(main);

  
  for (int j=0; j <= c-1; ++j) {
for (int i=0; i <= r-2; ++i){
  
  if ((t(i,j) == 5) & (t(i+1, j) == 1))
  {
    
    main(i, j)  = 1;
    main(i + 1, j) = 5;
  }
}

for (int i= r-1; i == r-1; ++i){
  if ((t(i, j) == 5) & (t(1, j) == 1))
  {
   
    main(i, j) = 1;
    main(1, j) = 5;
  }
}
  }

  return main;

}
4

1 回答 1

1

当我将值传递给 Rcpp 时,也许我有点偏执,但我也从不允许我的函数改变我传递的内容。但是这里需要 clone(main) 以避免对 main 更改 t 的更改。最后一项是将顶行的 1 索引更改为 0。

#include <Rcpp.h>

using namespace Rcpp;

//[[Rcpp::export]]

Rcpp::NumericMatrix up_rcpp(Rcpp::NumericMatrix main, int r, int c) {
  
  
  Rcpp::NumericMatrix ans = clone(main);
  Rcpp::NumericMatrix t = clone(main);

  
  for (int j=0; j <= c-1; ++j) {
    for (int i=0; i <= r-2; ++i){
 
      if ((t(i,j) == 5) && (t(i+1, j) == 1))
      {
        
        ans(i, j)  = 1;
        ans(i + 1, j) = 5;
        
      }
    }
    for (int i= r-1; i <= r-1; ++i){
      if ((t(i, j) == 5) && (t(0, j) == 1))
      {
        ans(i, j) = 1;
        ans(0, j) = 5;
      }
    }
  }
  
  return ans;
  
}

这使:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    1    1    1
[2,]    5    5    1    5    1
[3,]    5    5    5    5    1
[4,]    5    0    0    1    5
[5,]    5    1    0    5    1

这与第 4 列中的解决方案不同,但我理解逻辑的方式是正确的。

于 2021-10-15T23:54:16.037 回答