Операция вставки разреженной матрицы RcppEigen выдает ошибку недопустимого класса «dgCMatrix»

Я пытаюсь ускорить использование С++ для быстрого создания некоторых разреженных матриц для использования в R. Однако я не могу использовать метод вставки для изменения отдельных элементов разреженной матрицы в Eigen и получить правильный объект R класс dgCMatrix. Простой пример ниже.

Код С++:

#include <RcppEigen.h>

// [[Rcpp::depends(RcppEigen)]]
using Eigen::SparseMatrix;              // sparse matrix

// [[Rcpp::export]]
SparseMatrix<double> SimpleSparseMatrix(int n) {
  SparseMatrix<double> new_mat(n, n);
  new_mat.insert(0, 0) = 2;
  Rcpp::Rcout << new_mat << std::endl;
  return new_mat;
}

И в результате R:

> SimpleSparseMatrix(2)
2 0 
0 0 

2 x 2 sparse Matrix of class "dgCMatrix"
Error in validObject(x) : 
  invalid class “dgCMatrix” object: last element of slot p must match length of slots i and x

Как видно из stdout, eigen поступает правильно. Однако результирующий объект разреженной матрицы имеет неправильный формат. Действительно, просмотр его слотов показывает недопустимые значения для p:

> foo <- SimpleSparseMatrix(2)
2 0 
0 0 

> str(foo)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int 0
  ..@ p       : int [1:3] 0 2 4
  ..@ Dim     : int [1:2] 2 2
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : num 2
  ..@ factors : list()

Любые идеи, что может пойти не так?


person user3271788    schedule 01.11.2014    source источник


Ответы (1)


После оператора insert добавьте этот оператор:

  new_mat.makeCompressed();
person G. Grothendieck    schedule 02.11.2014