从Eigen :: SparseMatrix中提取块/ ROI而不进行复制

时间:2015-10-28 09:49:59

标签: c++ copy sparse-matrix eigen eigen3

我想知道从Eigen :: SparseMatrix中提取块/ ROI有什么好方法吗? 更确切地说,我想要提取的是内部向量

我想做的是:

typedef Eigen::SparseMatrix<double,Eigen::RowMajor> SpMat;
// Prepare some sparse matrix
SpMat spmat;
// Extract lines from it
const SpMat& row_i = spmat.innerVector(i);
const SpMat& row_j = spmat.innerVector(j);
// Some calculation with row_i and row_j...

根据我的测试,row_irow_j的数据是spmat复制(!!)。 但是,显然效率低下。 内部向量的数据(特别是row_i.m_data.m_values&amp; row_i.m_data.m_indices)是原始数据的连续部分(spmat.m_data.m_values&amp; spmat.m_data.m_indices resp。),所以应该有更聪明的方式

我可能能够实现新的方法来实现这一点,但它需要我深入挖掘源代码。所以我不想。

任何帮助都很感激! 提前谢谢。

2 个答案:

答案 0 :(得分:4)

您可以使用c ++ 11 auto关键字将row_irow_j声明为真正的读写表达式,或使用正确的类型:

const auto row_i = spmap.innerVector(i); // C++11 version
const SpMat::InnerVectorReturnType row_i = spmap.innerVector(i); // C++98 version

此外,默认情况下,SparseMatrix不存储在列major中,因此“内部向量”是一列。如果要引用行,则必须使用行主存储布局:

typedef Eigen::SparseMatrix<double,RowMajor> SpMat;

答案 1 :(得分:2)

您可以尝试使用MappedSparseMatrix课程。它包装了一组现有数据和相关参数(我想,我从未使用过它)。我认为它与Eigen::Map类的工作方式类似,但我可能错了。

MappedSparseMatrix<double> mat(int rows, int cols, int nnz,
                    int* outerIndexPtr, int* innerIndexPtr,
                    Scalar* valuePtr);

Source