我是一个Rcpp的新手(也是C++的新手)。我写了一段代码,使用这里的示例代码https://gist.github.com/kevinushey/4561281计算矩阵的行/列最大值和最小值:
#include <Rcpp.h>
using namespace Rcpp;
template <class T>
inline double do_max(T& x) {
return max(x);
}
template <class T>
inline double do_min(T& x) {
return min(x);
}
NumericVector colMaxsCpp(NumericMatrix& x) {
int nRows = x.nrow();
NumericVector out = no_init(nRows);
for (int i=0; i<nRows;i++) {
NumericMatrix::Row tmp = x(i,_);
out[i]=do_max(tmp);
}
return out;
}
NumericVector colMinsCpp(NumericMatrix& x) {
int nRows = x.nrow();
NumericVector out = no_init(nRows);
for (int i=0; i<nRows;i++) {
NumericMatrix::Row tmp = x(i,_);
out[i]=do_min(tmp);
}
return out;
}
NumericVector rowMaxsCpp(NumericMatrix& x) {
int nCols = x.ncol();
NumericVector out = no_init(nCols);
for (int i=0; i<nCols;i++) {
NumericMatrix::Column tmp = x(_,i);
out[i]=do_max(tmp);
}
return out;
}
NumericVector rowMinsCpp(NumericMatrix& x) {
int nCols = x.ncol();
NumericVector out = no_init(nCols);
for (int i=0; i<nCols;i++) {
NumericMatrix::Column tmp = x(_,i);
out[i]=do_min(tmp);
}
return out;
}
// [[Rcpp::export]]
NumericVector Max(NumericMatrix x, int dim) {
if (dim==1) {
return rowMaxsCpp(x);
} else if (dim==2) {
return colMaxsCpp(x);
}
}
// [[Rcpp::export]]
NumericVector Min(NumericMatrix x, int dim) {
if (dim==1) {
return rowMinsCpp(x);
} else if (dim==2) {
return colMinsCpp(x);
}
}
我希望修改代码,使do_min
和do_max
函数能够处理NA
。这些函数使用一个类的模板。
我在网上看到了NA_REAL
和NA_INTEGER
,但它们是特定于类的。
(a) 是否有适用于类的通用NA
可用(例如上面的示例)?
(b) 另外,是否有可用的函数,可以将变量x
子集化为仅使用非NA
元素,例如在R
中等同于max(x[!is.na(x)])
或min(x[!is.na(x)])
?
(c) 最后,上面的代码已经被编写为处理数字matrix
,但似乎即使输入一个整数matrix
也能正常工作(尽管输出被转换为numeric
)。这是为什么?
na_omit
的函数可以删除数据中的空值。 - Rolandmax(na_omit(x))
替换max(x)
,但它没有编译通过。您能告诉我如何使用max(x)
吗? - udayRcpp 0.11.1
。实际上,代码已经编译了,但是出现了像“第70行控制到达非void函数结尾”的错误。 - udayg++
会发出这种警告是正常的。您需要插入一个无条件返回,例如NumericVector NeverReached(1); return NeverReached;
来抑制它。 - Dirk Eddelbuettelelse if
语句需要一个最终的else
语句。 - uday