Eigen 简介
- Eigen 的目标是提供高性能的线性代数运算,适用于各种应用领域,包括科学计算、图形学、机器学习等。
- 它是一个开源库,从版本 3.1.1 开始遵循 MPL2 许可证。
- Eigen 的特点包括高度优化、易于使用、跨平台、仅包含头文件等。
安装 Eigen
- 你只需下载并解压 Eigen 的源代码即可使用。
- 在编译程序时,编译器需要找到 Eigen 的头文件。将 Eigen 源代码所在的目录添加到编译器的 include 路径中即可。
测试案例:
1、这段代码的功能是将test内的数字重新排列为123456789123456789.....,可以用于矩阵转置
例如将640*640*3的图片变换为3*640*640
#include <Eigen/Eigen>
#include <unsupported/Eigen/CXX11/Tensor>
float test[45] = { 1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,9,9,9,9,9 };
Eigen::TensorMap<Eigen::Tensor<float, 4, Eigen::RowMajor>> testtensor(test, 1, 3, 3, 5);
//去除第一个维度
Eigen::Tensor<float, 3, Eigen::RowMajor> testmatrix = testtensor.chip<0>(0);
//维度变换为5*3*3
Eigen::array<int, 3> shuffle_order = { 2, 0, 1 };
Eigen::Tensor<float, 3, Eigen::RowMajor> shuffled_tensor = testmatrix.shuffle(shuffle_order);
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 3; ++j)
{
for (int k = 0; k < 3; ++k)
{
std::cout << shuffled_tensor(i, j, k) << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>> reshapmatrix(test, 3, 15);
for (int j = 0; j < 3; ++j)
{
for (int k = 0; k < 15; ++k)
{
std::cout << reshapmatrix(j, k) << " ";
}
std::cout << std::endl;
}
float testy[3] = { 2,3,4 };
Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>> testtensory(testy, 3, 1);
// 定义乘法操作的维度
Eigen::array<Eigen::IndexPair<int>, 1> product_dims = { Eigen::IndexPair<int>(1, 0) };
// 进行矩阵乘法
Eigen::Tensor<float, 2, Eigen::RowMajor> rMask = testtensory.contract(reshapmatrix, product_dims);
std::vector<float> _testResult(45);
std::memcpy(_testResult.data(), rMask.data(), 45 * sizeof(float));
这段代码将数据重排为1234512345....
float _test[15] = { 1,1,1,2,2,2,3,3,3,4,4,4,5,5,5 };
Eigen::TensorMap<Eigen::Tensor<float, 3,Eigen::RowMajor>> tensor(_test, 1, 5, 3);
Eigen::array<int, 3> shuffle_order = { 0, 2, 1 };
Eigen::Tensor<float, 3,Eigen::RowMajor> shuffled_tensor = tensor.shuffle(shuffle_order);
float* _newTensor = shuffled_tensor.data();
std::vector<float>_testV(15);
std::memcpy(_testV.data(), _newTensor, sizeof(float) * 15);
注意:该库默认先填充列数据,再填充行数据,添加Eigen::RowMajor后优先填充行数据