我正在使用 Rcpp for R 编写一个函数,我想在其中执行向量叉积。所以在 R 中我正在表演
t(v)%*%v
所以我编写了以下 Rcpp 函数来执行此操作
arma_code <-
"arma::mat arma_vv(const arma::vec& v1, const arma::vec& v2) {
return v1.t() * v2;
};"
arma_vv = cppFunction(code = arma_code, depends = "RcppArmadillo")
这工作正常,但我宁愿处理 R 中的转置,因为有些情况下 v1 在输入之前已被转置,所以我尝试了以下方法
arma_code <-
"arma::mat arma_vv(const arma::vec& v1, const arma::vec& v2) {
return v1 * v2;
};"
arma_vv = cppFunction(code = arma_code, depends = "RcppArmadillo")
但它似乎将 v1 转换为列向量,即使我将其作为行向量传递,所以我收到错误
Error: matrix multiplication: incompatible matrix dimensions: 1000x1 and 1000x1
用几分钟(通常非常好且易于访问)犰狳文档将清楚地表明,对于一致外部产品,您需要一个列向量(或
arma::colvec
)和行向量(或arma::rowvec
)。
RcppArmadillo 两者都支持,但
arma::vec
是 arma::colvec
的简写。
> code <- "arma::mat vp(arma::colvec cv, arma::rowvec rv) { return cv * rv; }"
> Rcpp::cppFunction(code, depends = "RcppArmadillo")
> vp(as.numeric(1:4), as.numeric(1:4))
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 2 4 6 8
[3,] 3 6 9 12
[4,] 4 8 12 16
>