我有以下问题:
我有一个需要通过网络发送的Eigen::SparseMatrix,而我的网络库只支持发送原语类型的数组。
我可以通过执行如下操作(这里是backing object's code)来检索指向SparseMatrix的后备数组的指针:
// 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现在,在另一端,我可以访问这两个数组。但是,如果不将所有数据复制到新的SparseArray中(请参阅docs了解构造),则无法创建SparseMatrix。
我想做一些类似的事情:
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时,其中没有任何值。
发布于 2018-08-21 07:10:24
在深入研究之后,我认为对我来说一个很好的选择是使用Eigen::Map<Eigen::SparseMatrix<float>>:
Eigen::Map<Eigen::SparseMatrix<float>> sparse_map(num_rows, num_cols, num_non_zeros,
original_outer_index_ptr, original_inner_index_ptr,
original_values_ptr);AFAIK,这应该是零拷贝。来自here的回答。
https://stackoverflow.com/questions/51939356
复制相似问题