You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:42:06