我想知道从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_i
和row_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。),所以应该有更聪明的方式
我可能能够实现新的方法来实现这一点,但它需要我深入挖掘源代码。所以我不想。
任何帮助都很感激! 提前谢谢。
答案 0 :(得分:4)
您可以使用c ++ 11 auto
关键字将row_i
和row_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);