Eigen库行向量与矩阵逐元素乘法报尺寸不匹配错误
报错原因
Eigen中基于.array()的逐元素运算要求两个操作数的维度完全相等,不会像MATLAB那样自动对长度为1的维度做隐式广播扩展。
你的场景中:
eK是尺寸为1×10的固定尺寸行向量U是尺寸为11×10的动态尺寸复数矩阵
两者尺寸不匹配,直接调用.array()做乘法就会触发YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES静态断言错误。
MATLAB中.*运算符的行为是:如果两个操作数存在长度为1的维度,会自动将该维度复制扩展到和另一个操作数对应维度长度一致后再做逐元素运算,对应你的场景就是把1×10的eK沿行方向复制11次,拼成11×10的矩阵后再和U逐元素相乘。
正确实现方法
要实现和MATLAB.*完全一致的运算效果,有两种可行写法,优先推荐无内存拷贝的广播写法:
写法1:零拷贝广播(性能最优)
通过rowwise()接口指定按行广播,不需要额外复制向量内容,运算时直接按规则取向量对应元素参与计算:
// 等价MATLAB: U = 1i * eK .* U; U = U.array().rowwise() * (1i * eK).array();
写法2:显式复制扩展
如果需要先把向量扩展成和矩阵同尺寸再运算,可以用replicate()接口:
// 将eK沿行方向复制U.rows()份,列方向保持1份,得到和U同尺寸的矩阵后做逐元素乘 U = (1i * eK).replicate(U.rows(), 1).array() * U.array();
注意事项
- 你给出的错误代码中使用了
eKX、euhX两个未在示例代码中定义的变量,需要确认变量名和你实际定义的eK、U一致,避免额外的编译错误。 - Eigen的广播操作必须显式指定
rowwise()(按行方向对齐行向量)或colwise()(按列方向对齐列向量),不存在隐式广播行为。 - 复数运算时
1i * eK会自动推导为std::complex<double>类型,和U的Eigen::MatrixXcd类型匹配,不需要额外做类型转换。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

