rcpp命名数值矩阵 我不知道用C++代码中的列名来处理矩阵的方法。各种矩阵函数似乎没有重载,它们允许您按R中指定的名称对行或列进行寻址。我的用例是,您有一个sql查询中的值表,等等,其中每个列都有名称

rcpp命名数值矩阵 我不知道用C++代码中的列名来处理矩阵的方法。各种矩阵函数似乎没有重载,它们允许您按R中指定的名称对行或列进行寻址。我的用例是,您有一个sql查询中的值表,等等,其中每个列都有名称,c++,r,matrix,rcpp,C++,R,Matrix,Rcpp,以下是我提出的明显不完整且不理想的解决方案: class NamedNumericMatrix { public: NamedNumericMatrix(SEXP m) { M=NumericMatrix(m); List dimnames = M.attr("dimnames"); vector<string> colnames = dimnames[1]; for(int i = 0; i<colnames.s

以下是我提出的明显不完整且不理想的解决方案:

class NamedNumericMatrix {
public:
    NamedNumericMatrix(SEXP m)
    {
      M=NumericMatrix(m);
      List dimnames = M.attr("dimnames");
      vector<string> colnames = dimnames[1];
      for(int i = 0; i<colnames.size(); i++){
        map<string, int>::iterator it = colNameIndex.find(colnames[i]);
        if(it != colNameIndex.end()){
          throw std::invalid_argument("duplicate colname found");
        }
        colNameIndex[colnames[i]] = colNameIndex.size()-1;
      }
    }
    double GetValue(int row, string col){
      map<string, int>::iterator it = colNameIndex.find(col);
      if(it == colNameIndex.end()){
        throw std::invalid_argument("col name not found");
      }
      return M(row, it->second);
    }
  int nrow(){
    return M.nrow();
  }
  int ncol(){
    return M.ncol();
  }
private:
    NumericMatrix M;
    map<string, int> colNameIndex;
};
类名numericMatrix{
公众:
命名数字矩阵(SEXP m)
{
M=数值矩阵(M);
List dimnames=M.attr(“dimnames”);
向量colnames=dimnames[1];
对于(int i=0;等秒);
}
int nrow(){
返回M.nrow();
}
int ncol(){
返回M.ncol();
}
私人:
数值矩阵M;
映射colNameIndex;
};
我的问题是,有没有一种更简单的方法来实现这一点

只需使用返回字符向量的
colnames()

R> cppFunction("int showme(NumericMatrix M) { print(colnames(M)); return 0; }")
R> showme(matrix(1:9,3,dimnames=list(NULL, c("a1", "b2", "c3"))))
[1] "a1" "b2" "c3"
[1] 0
R> 

哦,对不起,重读一遍:你是指名字索引?我们通常将矩阵视为数值对象。您可以按名称索引
列表
数据帧
。对于矩阵,您可能已经用上述内容回答了您的问题。

这是有道理的,可能我更适合将此类数据存储在DataFrame中,我也这么认为。从数据库中,您还可以得到不同的类型,这些类型并不总是适合矩阵。