如何在C++ Eigen中对矩阵每行元素按向量元素逐元素求幂?
问题分析与解决
你的核心问题是未正确利用Eigen的广播机制,导致维度不匹配产生错误结果:
- 原代码中
x.array()是列向量数组(2×1),而M.array()是4×2数组,二者维度不匹配,Eigen无法按行广播,最终仅计算了矩阵第一行的元素幂,得到长度为2的向量。 M.array().rowwise().pow(x.array())报错是因为Eigen 3.4的RowwiseArrayXpr并未提供pow成员函数,这种写法不被支持。
正确实现方式
要实现每行元素按x对应元素逐元素求幂,只需将x转换为行向量数组,让Eigen自动将其广播到矩阵的每一行,即可完成逐元素幂运算。修改后的代码如下:
#include <Eigen/Dense> #include <vector> Eigen::MatrixXd func() { // [[10, 20], // [20, 30], // [30, 40], // [40, 50]] Eigen::MatrixXd M(4, 2); M(0, 0) = 10; M(0, 1) = 20; M(1, 0) = 20; M(1, 1) = 30; M(2, 0) = 30; M(2, 1) = 40; M(3, 0) = 40; M(3, 1) = 50; std::vector<double> x_numbers = {2, 3}; Eigen::Map<Eigen::VectorXd> x(x_numbers.data(), x_numbers.size()); // 将x转为行向量数组,Eigen自动广播到每一行 auto retval = M.array().pow(x.transpose().array()); return retval; }
关键说明
x.transpose().array()将列向量x转换为1×2的行向量数组,与M的列数匹配。- Eigen会自动将行向量广播到矩阵的所有行,实现每一行的第i个元素与x的第i个元素进行幂运算,完全符合需求且能利用SIMD特性,无需显式循环。
内容的提问来源于stack exchange,提问作者MxNx
相关产品推荐
相关产品推荐

