Опитвам се да ускоря използването на C++ за бързо изграждане на някои разредени матрици за използване в R. Изглежда обаче не мога да използвам метода на вмъкване, за да променя единични елементи на разредена матрица в Eigen и да получа правилен R обект на клас dgCMatrix. Един прост пример е по-долу.
Кодът на C++ е:
#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()
Някакви идеи какво може да се обърка?