特征稀疏矩阵的零复制构造

时间:2018-08-20 22:35:19

标签: c++ eigen zero-copy

我有以下问题:

我有一个Eigen::SparseMatrix,我需要通过网络发送,并且我的网络库仅支持发送原始类型的数组。

我可以通过执行以下操作来检索指向SparseMatrix的后备数组的指针:(这里是backing object's code):

// 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

现在在另一侧,我可以访问这两个数组。但是AFAIK无法在不将所有数据复制到新的SparseMatrix中的情况下创建SparseArray(有关构造,请参见docs)。

我想做类似的事情:

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时,其中没有任何值。

1 个答案:

答案 0 :(得分:0)

深入研究之后,我认为对我来说,一个不错的选择是像这样使用Client-2

Eigen::Map<Eigen::SparseMatrix<float>>

AFAIK,这应该是零副本。来自here的答复。