c++ - 特征稀疏矩阵的零拷贝构造
问题描述
我有以下问题:
我有一个Eigen::SparseMatrix
我需要通过网络发送,而我的网络库只支持发送原始类型的数组。
我可以通过执行以下操作来检索指向我的 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
现在在另一边,我可以访问这两个数组。但是 AFAIK 如果不将所有数据复制到新的 SparseMatrix 中,就无法创建 SparseArray(请参阅文档以了解构造)。
我想做类似的事情:
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);
AFAIK,这应该是零拷贝。从这里回答。
推荐阅读
- sql - 使用 SQL 根据指定的要求将值组合在一起?
- javascript - 从源代码中的 Highchart 图中获取工具提示值
- flutter - Flutter:布局卡
- php - 如何自定义dokan可下载产品文件上传循环?
- c - C中的if结构会影响变量的值吗?
- bash - 将 Shell 脚本与文件扩展名关联
- ios - UITableView ScrollToRow 函数动画奇怪
- regex - 正则表达式匹配用 {{ }} 封装的字符串前后的一个单词
- node.js - 使用 nodejs 在 Elasticsearch 7.3.2 中自定义映射类型
- java - maven 如何处理具有不同 group-id 的同一个 jar