Передача данных между LibTorch C ++ и Eigen

Передача данных между LibTorch C ++ и Eigen (Вопросы и помощь)

Привет всем, я разрабатываю инструменты передачи данных для библиотек линейной алгебры C ++, как вы можете видеть здесь: https://github.com/andrewssobral/dtt (с учетом двумерных массивов или матриц), и мне интересно, можете ли вы помочь мне со следующим кодом для передачи данных между LibTorch и Eigen:

std::cout << "Testing LibTorch to Eigen:" << std::endl;
// LibTorch
torch::Device device(torch::cuda::is_available() ? torch::kCUDA : torch::kCPU);
torch::Tensor T = torch::rand({3, 3});
std::cout << "LibTorch:" << std::endl;
std::cout << T << std::endl;
// Eigen
float* data = T.data_ptr<float>();
Eigen::Map<Eigen::MatrixXf> E(data, T.size(0), T.size(1));
std::cout << "EigenMat:\n" << E << std::endl;
// re-check after changes
E(0,0) = 0;
std::cout << "EigenMat:\n" << E << std::endl;
std::cout << "LibTorch:" << std::endl;
std::cout << T << std::endl;

Это результат кода:

--------------------------------------------------
Testing LibTorch to Eigen:

LibTorch:
 0.6232  0.5574  0.6925
 0.7996  0.9860  0.1471
 0.4431  0.5914  0.8361
[ Variable[CPUFloatType]{3,3} ]

EigenMat (after data transfer):
0.6232 0.7996 0.4431
0.5574  0.986 0.5914
0.6925 0.1471 0.8361

# Modifying EigenMat, set element at (0,0) = 0
EigenMat:
     0 0.7996 0.4431
0.5574  0.986 0.5914
0.6925 0.1471 0.8361

# Now, the LibTorch matrix was also modified (OK), but the rows and columns were switched.
LibTorch:
 0.0000  0.5574  0.6925
 0.7996  0.9860  0.1471
 0.4431  0.5914  0.8361
[ Variable[CPUFloatType]{3,3} ]

Кто-нибудь знает, что происходит? Есть способ сделать это лучше?

Мне также нужно сделать то же самое для Armadillo, ArrayFire и OpenCV (cv :: Mat). Заранее спасибо!


person Andrews Cordolino Sobral    schedule 23.08.2019    source источник
comment
Для броненосца есть .memptr () и расширенные конструкторы матриц. Если входные данные имеют формат основной строки, используйте strans (), чтобы транспонировать матрица после построения.   -  person hbrerkere    schedule 25.08.2019


Ответы (1)


Причина переключения строк и столбцов заключается в том, что LibTorch (по-видимому) использует основное хранилище строк, тогда как Eigen по умолчанию использует основное хранилище столбцов. Я не знаю, можете ли вы изменить поведение LibTorch, но с Eigen вы также можете использовать хранилище с большим количеством строк, например:

typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatrixXf_rm; // same as MatrixXf, but with row-major memory layout

а затем используйте это так:

Eigen::Map<MatrixXf_rm> E(data, T.size(0), T.size(1));
person chtz    schedule 24.08.2019
comment
Вы знаете, есть ли аналог Armadillo в Eigen :: RowMajor? - person Andrews Cordolino Sobral; 24.08.2019