#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. Опять же, это для плотных матриц, и да, мы используем с большим эффектом.