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

如何用Eigen库实现MATLAB矩阵按列归一化的等价C++代码?

问题分析

你遇到的错误核心是Eigen不会像MATLAB那样自动对维度不匹配的数组做广播(broadcast)处理。在MATLAB里,当你用1×N的行向量和M×N的矩阵做运算时,它会自动把行向量复制M次,变成和矩阵同维度的结构后再逐元素计算;但Eigen需要你显式指定这个广播逻辑,否则就会触发维度不匹配的断言错误。

从你的MATLAB测试用例来看,abs(m/max(m))的实际逻辑是:对矩阵的每一列,将该列所有元素除以该列的最大值,再取绝对值,最终得到和原矩阵同维度的结果(比如2×2的测试用例会得到2×2的输出)。

解决方案

在Eigen中,你可以通过replicate()方法把每列最大值的行向量复制成和原矩阵相同行数的矩阵,以此模拟MATLAB的自动广播行为,之后再完成除法和取绝对值操作。

修正后的完整代码如下:

#include <iostream>
#include <eigen3/Eigen/Dense>

using namespace Eigen;
using namespace std;

int main() {
    MatrixXd A(2,2);
    MatrixXd B(2,2); // 结果维度和原矩阵一致,并非你标注的2×1
    MatrixXd C(1,2);

    A << 4, 12,
         6, 8;

    // 计算每列的最大值,得到1×2的行向量,和MATLAB的max(m)结果一致
    C = A.colwise().maxCoeff();

    // 将行向量C复制成和A相同行数的矩阵,再逐元素相除、取绝对值
    B = (A.array() / C.replicate(A.rows(), 1).array()).cwiseAbs();

    cout << "The solution is:\n" << B << endl;
    return 0;
}

代码细节解释

  1. C = A.colwise().maxCoeff();:正确计算矩阵每一列的最大值,输出1×2的行向量,和MATLAB的max(m)完全对应。
  2. C.replicate(A.rows(), 1):把1×2的行向量C复制A.rows()(也就是2)次,生成一个2×2的矩阵,每一行都是原C的内容,这一步就实现了MATLAB的自动广播效果。
  3. A.array() / ...array():将矩阵转换为数组类型,执行逐元素除法运算。
  4. .cwiseAbs():对结果逐元素取绝对值,对应MATLAB的abs()函数。

运行结果

编译运行后,输出会和你的MATLAB测试结果数值一致(格式略有差异):

The solution is:
0.6667      1
     1 0.6667

第一列是4/6≈0.6667、6/6=1;第二列是12/12=1、8/12≈0.6667,完全匹配MATLAB的计算结果。

推广到181×238的矩阵

如果要处理181×238的矩阵B2,逻辑完全一致,只需替换矩阵维度即可:

// 假设B2是已初始化的181×238矩阵
MatrixXd col_max = B2.colwise().maxCoeff(); // 得到1×238的行向量
MatrixXd B3 = (B2.array() / col_max.replicate(B2.rows(), 1).array()).cwiseAbs();
// B3为181×238的矩阵,对应MATLAB的B3=abs(B2/max(B2))

如果你的真实需求是得到181×1的矩阵,那可能是对MATLAB代码的逻辑理解有误,可以补充说明具体需求后再调整。

内容的提问来源于stack exchange,提问作者ANAGHA S GOURI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:32:50