尝试移动 NumericMatrix 中的数字

Trying to move numbers in NumericMatrix

我在 Rcpp 中创建了一个双 for 循环,以便在下一个可用单元格中有 5 个单元格的列中向上移动一个全为 1 的单元格。当我编译代码时,我没有收到任何错误,但代码确实在矩阵中移动了 1,它只是 returns 相同的矩阵。让我们取一个原始矩阵,假设名为 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;

}

当我将值传递给 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 列中的解决方案不同,但按照我理解的逻辑,这是正确的。