c++ - RcppEigen 稀疏矩阵插入操作给出无效类 “dgCMatrix” 错误

标签 c++ r sparse-matrix rcpp

我正在努力加快使用 C++ 快速构建一些用于 R 的稀疏矩阵的速度。但是,我似乎无法使用插入方法更改 Eigen 中稀疏矩阵的单个元素并获得正确的类 dgCMatrix 的 R 对象。下面是一个简单的例子。

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

正如您从标准输出中看到的那样,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()

有什么想法可能会出错吗?

最佳答案

insert 语句之后添加此语句:

  new_mat.makeCompressed();

关于c++ - RcppEigen 稀疏矩阵插入操作给出无效类 “dgCMatrix” 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26694446/

相关文章:

r - 是否可以叠加 SpatialLinesDataFrame 和 SpatialPolygonsDataFrame

c++ - 转换数据包数据的 Python 和 C++ 套接字

c++ - 在实现 OpenFileDialog 框 ,"System.IO.FileStream"出现在结果编辑文本框而不是文件名和路径上。如何?

C++ - 从另一个类构造函数调用类构造函数

从数据框中删除重复的单词

r - 在 Venneuler R 包中显示计数

python - SciPy - 点积在稀疏和密集矩阵上的推广

python - 索引 [201] = [0,8] 是乱序的。许多稀疏操作需要排序索引。使用 `tf.sparse.reorder` 创建正确排序的副本

python - scipy 稀疏矩阵中每一行或列的 Argmax

c++ - 如何使用指向第一个元素的指针分配 C++ 数组?