I’m extracting a submatrix `B`

from a matrix `A`

using **Rcpp**. Benchmarking has shown that this is slower than the ordinary R way.

Why is it slow and is there a faster way with **Rcpp**? (the indices are not contiguous in general). I have also tested with **RcppEigen**, but the result is the same.

The reason why extracting a submatrix using **Rcpp** is slower than the ordinary R way is because **Rcpp** performs the extraction in a row-wise manner, which can be inefficient for non-contiguous indices.

To achieve faster submatrix extraction with **Rcpp**, you can use the Eigen library in **RcppEigen**. Eigen provides a more efficient way to extract submatrices using a column-major storage format, which aligns with how matrices are stored in R.

Here’s an example code snippet using **RcppEigen** to extract a submatrix from a matrix `A`

:

```
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
Eigen::MatrixXd extractSubmatrix(Eigen::MatrixXd A, Eigen::VectorXi rows, Eigen::VectorXi cols) {
return A(rows, cols);
}
```

In this code, `A`

is the input matrix, and `rows`

and `cols`

are vectors specifying the row and column indices of the submatrix to extract. The function `extractSubmatrix`

returns the extracted submatrix as a `MatrixXd`

object.

You can then call this function from R to extract the submatrix efficiently:

```
library(Rcpp)
sourceCpp("path/to/cpp/file.cpp")
A <- matrix(1:9, nrow = 3)
rows <- c(2, 3)
cols <- c(1, 3)
B <- extractSubmatrix(A, rows, cols)
```

By using **RcppEigen** and the Eigen library, you should be able to achieve faster submatrix extraction compared to the ordinary R way.