在 Rcpp 中创建对角矩阵但结果是错误的

Create diagonal matrix in Rcpp but the result is wrong

代码应该创建一个值为 1 的对角矩阵。

// [[Rcpp::export]]
NumericMatrix filterOne(int g_size){

    NumericMatrix filter(g_size, g_size);   
    int ptr, ptr2;

    for(ptr=0;ptr<g_size;ptr++){
        Rcout << ptr << endl;
        filter[ptr, ptr] = 1;       
    }
    
    // the following printing is
    // for checking the content
    for(ptr=0;ptr<g_size;ptr++){    
        for(ptr2=0;ptr2<g_size;ptr2++){         
            Rcout << ptr+1 << " - " << ptr2+1 << " : " << filter[ptr, ptr2] <<  endl;
        }
    }

return filter;
}

所以我在R环境中调用x = filterOne(3),结果是:

0
1
2
1 - 1 : 1
1 - 2 : 1
1 - 3 : 1
2 - 1 : 1
2 - 2 : 1
2 - 3 : 1
3 - 1 : 1
3 - 2 : 1
3 - 3 : 1

似乎所有单元格的值都是1。然后,只需键入x即可在RGUI中查看返回的矩阵值:

     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    1    0    0
[3,]    1    0    0

怎么会这样?

如果有人使用相同的代码但可以生成正确的结果,请告诉我。 非常感谢。

我认为问题在于您访问 NumericMatrix 元素的方式。您应该使用 ( ) 而不是 [ ]。以下作品:

// [[Rcpp::export]]
NumericMatrix filterOne(int g_size){
  NumericMatrix filter(g_size, g_size);   
  int ptr, ptr2;
  
  for(ptr=0;ptr<g_size;ptr++){
    filter(ptr, ptr) = 1;       
  }
  
  return filter;
}

> filterOne(3)
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1