Эффективный выбор несмежных столбцов разреженной матрицы в Rcpp-Armadillo

#c #sparse-matrix #rcpp #armadillo #submatrix

#c #разреженная матрица #rcpp #armadillo #подматрица

Вопрос:

Я сталкиваюсь с кажущейся простой задачей, но я изо всех сил пытаюсь найти эффективный способ сделать это. В Armadillo я определил разреженную матрицу (sp_mat), из которой я хочу извлечь несколько несмежных столбцов. К сожалению, разреженные матрицы не поддерживают несмежное представление, поэтому я написал для него свою собственную функцию:

 arma::sp_mat col_sp(const arma::sp_matamp; x,const arma::uvecamp; index) {
int n_cols = index.n_elem;
arma::sp_mat x_subset(x.n_rows,index.n_elem);
for(int i=0; i<n_cols; i  ){
    x_subset.col(i) = x.col(index(i));
}
return x_subset;}
  

Однако я обеспокоен тем, что эта функция создает новую копию и / или перераспределяет память каждый раз, когда я добавляю новый столбец в x_subset . Действительно ли это так, и, если да, есть ли лучший способ получить желаемую подматрицу?

Комментарии:

1. Да, разреженные матрицы в этом случае немного более ручные, и элегантность плотных матриц и операций с блоками столбцов-векторов исчезает. Но, выполняя всю эту работу «по ячейкам», нам удалось работать с действительно большими столбцами. Это компромисс.

2. @DirkEddelbuettel благодарю вас за ваш ответ и всю вашу работу над Rcpp! Я все еще новичок в Rcpp-Armadillo, но я прочитал кое-что в документации о продвинутых конструкторах, с помощью которых может быть выделена матричная память. Можно ли выделить правильную память для x_subset перед ее заполнением, чтобы предотвратить ненужные копии? Количество ненулевых элементов в каждом столбце моего полного sp_mat одинаково.

3. Опять же, это для плотных матриц, и да, мы используем с большим эффектом.