Rcpp (Eigen),复制或重复行

Rcpp (Eigen), duplicate or repeat rows

我想知道在 Rcpp、c++ 或 Eigen 中是否有一种方法可以将给定矩阵的每一行复制或重复 n 次?

例如,如果我有一个 2 x 2 矩阵...:

(1,2
 3,4)

...将其转换为 4 x 2 矩阵,例如:

(1,2
 1,2
 3,4
 3,4)

我在 Whosebug 上或 Eigen 或 Rcpp 文档中的任何地方都没有找到任何类似这样的方法或问题。

我知道,我可以在 Rcpp 中使用 for 循环或 R 函数,但我担心,这会消耗大量性能。

任何人都可以提供有关如何执行此操作的提示吗?

编辑:这对于 R 来说似乎是一个简单的案例,但它不适用于导致内存超出的大矩阵。无论如何,我正在将数据传递给已编译的 Rcpp 函数,所以我想在其中进行。

问候 蒂姆

您可能不需要为此使用 Rcpp 或 Eigen。以下是在 R 中本机矢量化的,不需要循环,因此应该足够快。

mat[rep(seq(nrow(mat)), each = 2),]
#>      [,1] [,2]
#> [1,]    1    2
#> [2,]    1    2
#> [3,]    3    4
#> [4,]    3    4

用 C++ 编写等价物可能会提高一些性能,但如果它产生巨大差异,我会感到惊讶。如果有疑问,您可以随时进行分析。

如果你想要一个做同样事情的 Rcpp 函数,那么你可以尝试:

Rcpp::cppFunction("NumericMatrix double_matrix(NumericMatrix m) {
   int nrow = 2 * m.rows();
   NumericMatrix res(nrow, m.ncol());
   for(int i = 0; i < nrow; ++i){
     res(i, _) = m((int) i / 2, _);
   }
   return res;
}")

所以你可以这样做:

double_matrix(mat)
#>      [,1] [,2]
#> [1,]    1    2
#> [2,]    1    2
#> [3,]    3    4
#> [4,]    3    4

数据

mat <- matrix(c(1, 3, 2, 4), ncol = 2)

mat
#>      [,1] [,2]
#> [1,]    1    2
#> [2,]    3    4

也许 kronecker 是您使用基数 R

时的一个选项
> kronecker(mat, rep(1, 2))
     [,1] [,2]
[1,]    1    2
[2,]    1    2
[3,]    3    4
[4,]    3    4