在不复制的情况下从 Eigen::SparseMatrix 中提取 blocks/ROIs
Extracting blocks/ROIs from Eigen::SparseMatrix without copying
请问有什么好的方法可以从Eigen::SparseMatrix中提取出blocks/ROIs?
更准确地说,我要提取的是内部向量.
我想做的是这样的:
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
& row_i.m_data.m_indices
)是原始数据(spmat.m_data.m_values
& spmat.m_data.m_indices
resp.)的连续部分,所以应该有更聪明的方法。
我也许能够实现新方法来执行此操作,但这需要我深入研究源代码。所以我不想。
感谢任何帮助!
提前致谢。
您可以尝试使用 MappedSparseMatrix
class. It wraps an existing set of data and associated parameters (I think, I've never used it). I assume it works similarly to the Eigen::Map
class 但我可能错了。
MappedSparseMatrix<double> mat(int rows, int cols, int nnz,
int* outerIndexPtr, int* innerIndexPtr,
Scalar* valuePtr);
您可以使用 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 存储在主要列中,因此 "inner-vector" 是一个列。如果要引用行,则必须使用行优先存储布局:
typedef Eigen::SparseMatrix<double,RowMajor> SpMat;
请问有什么好的方法可以从Eigen::SparseMatrix中提取出blocks/ROIs? 更准确地说,我要提取的是内部向量.
我想做的是这样的:
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
& row_i.m_data.m_indices
)是原始数据(spmat.m_data.m_values
& spmat.m_data.m_indices
resp.)的连续部分,所以应该有更聪明的方法。
我也许能够实现新方法来执行此操作,但这需要我深入研究源代码。所以我不想。
感谢任何帮助! 提前致谢。
您可以尝试使用 MappedSparseMatrix
class. It wraps an existing set of data and associated parameters (I think, I've never used it). I assume it works similarly to the Eigen::Map
class 但我可能错了。
MappedSparseMatrix<double> mat(int rows, int cols, int nnz,
int* outerIndexPtr, int* innerIndexPtr,
Scalar* valuePtr);
您可以使用 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 存储在主要列中,因此 "inner-vector" 是一个列。如果要引用行,则必须使用行优先存储布局:
typedef Eigen::SparseMatrix<double,RowMajor> SpMat;