我有两个大型数值矩阵,想要在R中计算它们的笛卡尔积。是否有比我当前的方法更高效、内存使用更低的方法?
编辑:我添加了一个Rcpp版本,它的性能已经比我的第一个纯R方法好很多了。由于我对Rcpp或RcppArmadillo并不熟悉:是否有更快/更标准化的方法来编写这个Rcpp函数?
m1 <- matrix(sample(0:9, size=110000, replace = TRUE), ncol = 110)
m2 <- matrix(sample(0:9, size=110000, replace = TRUE), ncol = 110)
#Current approach:
m3 <- apply(m1, 1, function(x) x * t(m2))
matrix(m3, ncol = 110, byrow = TRUE)
#EDIT - Rcpp approach
library(Rcpp)
#assuming ncol(m1) == ncol(m2)
cppFunction('IntegerMatrix cartProd(IntegerMatrix m1, IntegerMatrix m2) {
int nrow1 = m1.nrow(), ncol = m1.ncol(), nrow2 = m2.nrow();
int orow = 0;
IntegerMatrix out(nrow1 * nrow2, ncol);
for (int r1 = 0; r1 < nrow1; r1++) {
for (int r2 = 0; r2 < nrow2; r2++) {
for (int c = 0; c < ncol; c++){
out(orow, c) = m1(r1, c) * m2(r2, c);
}
orow++;
}
}
return out;
}')
m5 <- cartProd(m1, m2)
m4 = matrix(rep(t(m1), each=nrow(m1)) * c(m2), ncol=nrow(m1)) ; all.equal(m3, m4)
- user20650