c++ - 在不复制的情况下从 Eigen::SparseMatrix 中提取 block /ROI

标签 c++ copy sparse-matrix eigen eigen3

我想知道有没有什么好的方法可以从 Eigen::SparseMatrix 中提取 block /ROI? 更准确地说,我要提取的是内部 vector

我想做的是这样的:

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复制 (!!) 的。 然而,显然,它是低效的。 内部 vector 的数据(尤其是row_i.m_data.m_values & row_i.m_data.m_indices)是原始数据(spmat.m_data.m_values & spmat.m_data.m_indices 分别),所以应该有更聪明的方法。

我也许能够实现新方法来执行此操作,但这需要我深入挖掘源代码。所以我不想。

如有帮助,不胜感激! 提前致谢。

最佳答案

您可以使用 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 存储在主要列中,因此“内部 vector ”是一个列。如果要引用行,则必须使用行优先存储布局:

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

关于c++ - 在不复制的情况下从 Eigen::SparseMatrix 中提取 block /ROI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33387750/

相关文章:

c++ - 用花括号 C++ 实例化一个对象

c++ - 将一个文件的内容复制到另一个文件会使另一个文件为空

c++ - 模板类和 vector

amazon-s3 - 带有 ContentEncoding 参数的 boto3 s3 copy_object

python - 如何在 Python 的 SciPy 中删除稀疏矩阵中的小元素?

c++ - 使用 cudaMallocPitch 分配一维数组,然后使用 cudaMemcpy2D 3 复制到设备

c++ - 为什么使用私有(private)动态数组时性能最差

Dockerfile 复制不适用于 Nextcloud 容器

使用cmd命令 'copy'在C中复制文件

python - 计算 scipy 稀疏矩阵的稀疏传递闭包