在我的应用程序中,我必须通过网络发送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容器时我做错什么了吗?
答案 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+=
中的重新分配是不相关的。