У меня есть следующая проблема:
у меня есть 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 нет способа создать SparseArray без копирования всех данных в новый 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
в нем нет ценностей.
После того, как покопаться, я думаю, что хорошим вариантом для меня будет использование 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, это должно быть с нуля. Ответ от Вот.
Других решений пока нет …