潜在Dirichlet分配中Eigen :: SparseMatrix中元素的快速访问

时间:2019-06-24 05:34:03

标签: c++ eigen rcpp rcpp11

我正在Rcpp中实现Latent Dirichlet Allocation (LDA)。在LDA中,我们需要处理庞大的稀疏矩阵(例如50 x 3000)。

我决定在Eigen中使用SparseMatrix。但是,由于我需要访问每个单元格,因此computationally expensive .coeffRef会大大降低我的功能。

在保持速度的同时,有什么方法可以使用SparseMatrix吗?

我想做的事情有四个步骤,

  1. 我知道我要访问哪个单元格(i,j)。
  2. 我想知道单元格(i,j)是否为0。
  3. 如果单元格(i,j)不为0,我想知道它的值。
  4. 对步骤2和3中的值进行了一些分析之后,我想更新单元格(i,j)。在这一步中,我可能需要更新最初具有0的单元格(i,j)。
#include <iostream>
#include <Eigen/dense>
#include <Eigen/Sparse>
using namespace std;
using namespace Eigen;
typedef Eigen::Triplet<double> T;

int main(){

  Eigen::SparseMatrix<double> spmat;

  // Insert in spmat
  vector<T> tripletList;
  int value;

  tripletList.push_back(T(0,1,1));
  tripletList.push_back(T(0,3,2));
  tripletList.push_back(T(1,5,3));
  tripletList.push_back(T(2,4,4));
  tripletList.push_back(T(4,1,5));
  tripletList.push_back(T(4,5,6));
  spmat.resize(5,7);  // define size
  spmat.setFromTriplets(tripletList.begin(), tripletList.end());

  for(int i=0; i<5; i++){ // I am accessing all cells just to clarify I need to access cell
    for(int j=0; j<7; j++){
      // Check if (i,j) is 0  
      if(spmat.coeffRef(i,j) != 0){
        // Some analysis
        value = spmat.coeffRef(i,j)*2;  // just an example, more complex in the model
      }
      spmat.coeffRef(i,j) += value;  // update (i,j)
    }
  }

  cout << spmat << endl;

  return 0;
}

由于行数比列小得多,因此我考虑访问列,然后检查行值,但无法处理SparseMatrix<double>::InnerIterator it(spmat, colid)

0 个答案:

没有答案