我有以下问题:
我有一个Eigen::SparseMatrix
我需要通过网络发送,而我的网络库仅支持发送原始类型的数组。
我可以通过执行类似的操作来检索指向 SparseMatrix 的支持数组的指针(这是支持对象的代码 https://eigen.tuxfamily.org/dox/CompressedStorage_8h_source.html):
// Get pointers to the indices and values, send data over the network
int num_items = sparse_matrix.nonZeros()
auto values_ptr = sparse_matrix.data().valuePtr()
auto index_ptr = sparse_matrix.data().indexPtr()
network_lib::send(values_ptr, num_items)
network_lib::send(index_ptr, 2 * num_items) // Times two b/c we have 2 indices per value
现在在另一边我可以访问这两个数组。但据我所知,如果不将所有数据复制到新的 SparseMatrix 中,就无法创建 SparseArray (请参阅docs http://eigen.tuxfamily.org/dox-3.2/group__TutorialSparse.html#title3用于建筑)。
我想做这样的事情:
Eigen::SparseMatrix<float> zero_copy_matrix(num_rows, num_cols);
zero_copy_matrix.data().valuePtr() = received_values_ptr;
zero_copy_matrix.data().indexPtr() = received_index_ptr;
但这会引发编译器错误:
error: lvalue required as left operand of assignment zero_copy_matrix.data().valuePtr() = received_values_ptr;
关于如何从现有的索引和数据数组零复制构造稀疏特征矩阵有什么想法吗?
我尝试过的另一种方法不起作用(这是本地的,没有通信):
zero_copy_matrix.reserve(num_non_zeros);
zero_copy_matrix.data().swap(original_matrix.data());
当我尝试打印时zero_copy_matrix
它没有任何价值。