gpt4 book ai didi

c++ - Eigen 稀疏矩阵的零拷贝构造

转载 作者:太空狗 更新时间:2023-10-29 23:11:06 26 4
gpt4 key购买 nike

我有以下问题:

我有一个 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

现在在另一边我可以访问这两个数组。但是据我所知,如果不将所有数据复制到新的 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 时,它没有任何值。

最佳答案

在仔细研究之后,我认为对我来说一个不错的选择是使用 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);

据我所知,这应该是零拷贝。来自 here 的回答.

关于c++ - Eigen 稀疏矩阵的零拷贝构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51939356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com