gpt4 book ai didi

c++ - rcpp 命名数字矩阵

转载 作者:行者123 更新时间:2023-11-30 02:33:06 24 4
gpt4 key购买 nike

使用 Rcpp 时,我无法找到一种在 C++ 代码中按列名寻址矩阵的方法。对于各种 Matrix 函数似乎没有重载,这些函数允许您按 R 中指定的名称来寻址行或列。我的用例是您有一个来自 sql 查询等的值表,其中每一列被命名。

这是我想出的明显不完整且不理想的解决方法:

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;
};

我的问题是,使用 Rcpp 有更简单的方法吗?

最佳答案

只需使用返回字符 vector 的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>

哦,抱歉,重新阅读:您指的是 index 的名字吗?我们主要将矩阵视为数字对象。您可以按名称索引 ListDataFrame。对于矩阵,您可能已经用上面的内容回答了您的问题。

关于c++ - rcpp 命名数字矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35816852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com