Extracting submatrix w/ Rcpp


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:


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.