本征图稀疏对象的操作

时间:2018-08-21 23:55:42

标签: c++ eigen

在我的应用程序中,我必须通过网络发送Eigen::SparseMatrix<float>个对象,这意味着我需要对其进行序列化,另一方面,按照sometimes中的建议,将它们反序列化为Eigen::Map<Eigen::SparseMatrix<float>>

我现在的问题是我想在接收端执行一些操作,即对所有到达的矩阵求和。

但是,当我尝试将两个Eigen :: Map对象加在一起时,会产生编译器错误。我尝试对Eigen :: Map:

执行的任何操作都是如此
// This leads to a compiler error
Eigen::Map<Eigen::SparseMatrix<float>> recon = SerializedVectorToMappedSparseMatrix(serialized_vec);
Eigen::Map<Eigen::SparseMatrix<float>> recondouble = recon * 2;
  

错误:从'const type {aka const   Eigen :: SparseMatrix}”转换为非标量类型   要求“ Eigen :: Map>”
  Eigen :: Map> recondouble =(recon *   2).eval();

但是,它可以按预期进行编译和工作:

Eigen::SparseMatrix<float> recondouble = recon * 2;

在我的网络情况下,我想对现有和传入的Map求和:

existing_matrix += incoming_matrix;

这会导致编译器错误:

  

错误:“ operator =”不匹配(操作数类型为   “ Eigen :: Map>”和“ const”   Eigen :: CwiseBinaryOp,   const Eigen :: Map>,const   Eigen :: Map>>’)返回   派生()=派生()+ other.derived();

所以我的问题是:如果要在对象之间执行操作,是否应该将Eigen :: Map对象转换为Eigen:Matrix? this question似乎表示其他建议。

使用Eigen :: Map容器​​时我做错什么了吗?

1 个答案:

答案 0 :(得分:1)

Map对象是现有内存的包装,允许您将其视为实际上是一个Eigen对象,但有一些例外。具体来说,您无法更改内存,因此不允许调整大小,分配等。在您的示例中,

Eigen::Map<Eigen::SparseMatrix<float>> recondouble = recon * 2;

应更改为

Eigen::SparseMatrix<float> recondouble = recon * 2;

(如您在问题中所指出的),因为operator= /控制器需要为recondouble分配内存。稀疏operator+=经常需要重新分配内存,除非rhs元素是lhs元素的子集。我不知道映射的稀疏矩阵是否由于这个原因而不允许该操作(并且我现在没有时间研究它)。

P.S。文档中的示例仅讨论稠密矩阵,因此在operator+=中的重新分配是不相关的。