Eigen 库的矩阵操作举例测试

        

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后优先填充行数据

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值