Я пытаюсь ускорить использование С++ для быстрого создания некоторых разреженных матриц для использования в 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()
Любые идеи, что может пойти не так?