opencv - 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) 做同样的事情。提前致谢!
解决方案
切换行和列的原因是 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));
推荐阅读
- android - 尝试使用 volley 连接到 mysql
- python - 计算嵌套列表中第一个位置的相同元素
- python - Python OpenCV cv2 - 将图像的亮度和对比度提高 100% 的简单方法
- javascript - 如何在执行插入\删除\编辑时刷新一行而不在jquery和ajax中重新加载整页
- swift - 如何在 swift 中为 HKT 声明协议?
- r - 替换 DataFrame 中多个因子变量的 NA 值
- angular - 错误:无法解析位置的所有参数:(?)在 angular7 webpack 应用程序中
- html - 无法在移动 Chrome 中进行“固定”工作?
- javascript - 获取 javascript 类中的文档计数列表
- python-3.x - 烧瓶图像上传在服务器上不起作用,显示权限问题