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
我想知道在 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