Rcpp计算邻接矩阵楔形计数报错:下标值非数组、指针或向量
解决Rcpp邻接矩阵楔形计数的下标访问错误
错误原因
你遇到的编译错误是因为Rcpp的NumericMatrix不支持C++原生二维数组的[i][j]双下标语法。Rcpp矩阵类的元素访问需要使用圆括号(行索引, 列索引),而非方括号嵌套的写法,编译器无法识别x[i][j]这种调用,因此抛出"subscripted value is not an array, pointer, or vector"错误。
修正后的代码
将所有方括号嵌套的元素访问替换为圆括号即可解决问题:
#include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] double wedge_cnt_cpp(NumericMatrix x){ size_t n = x.nrow(); double temp = 0.0; for(size_t i=0; i<n; i++){ for(size_t j=0; j<n; j++){ for(size_t k=0; k<n; k++){ temp += x(i,j) * x(j,k); } } } return temp; }
额外优化建议
你的代码实际计算的是邻接矩阵与自身乘积的所有元素之和(等价于R代码中的sum(x %*% x)),完全可以利用Rcpp内置的矩阵运算简化实现,不仅代码更简洁,还能借助优化后的矩阵乘法提升效率:
#include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] double wedge_cnt_cpp(NumericMatrix x){ NumericMatrix xx = x * x; return sum(xx); }
内容的提问来源于stack exchange,提问作者ann
相关产品推荐
相关产品推荐

