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

如何定义可接受Eigen表达式的通用MatrixBase函数参数?

问题原因分析
  • 首先,函数输入参数为非常量左值引用Eigen::MatrixBase<D>& in,而A*B属于临时生成的Eigen表达式右值,无法绑定到非常量左值引用,同时临时表达式本身带const属性,类型不匹配。
  • 其次,两个入参共用同一个模板参数D推导,A*B的实际类型为特化的Eigen::Product表达式类,第二个参数res的类型是Eigen::VectorXd对应的派生类,二者类型不一致导致模板参数推导冲突,无法匹配到对应的函数重载。
解决方案

不需要更换比Eigen::MatrixBase更通用的基类,只要调整模板参数和参数修饰符即可:

  1. 输入参数改为const Eigen::MatrixBase<D>&,即可支持接收const属性的临时表达式
  2. 输入和输出参数分别使用独立的模板参数,避免推导冲突

修改后可正常运行的代码如下:

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

// 输入输出用独立模板参数,输入加const修饰
template <typename DerivedIn, typename DerivedOut>
void eval(const Eigen::MatrixBase<DerivedIn>& in, Eigen::MatrixBase<DerivedOut>& out)
{
    out.array() = in.array() + 1;
}

int main()
{
    Eigen::MatrixXd A(2,2);
    A(0,0) = 2;
    A(1,1) = 1;
    Eigen::VectorXd B(2);
    B(1) = 1;
    std::cout << A << ", " << B << std::endl;

    Eigen::VectorXd res(2);

    eval(A*B, res);
    std::cout << res << std::endl;
}
扩展说明

如果需要支持写入表达式(比如左值表达式作为输出),当前的Eigen::MatrixBase<DerivedOut>&写法已经覆盖需求,Eigen官方的泛型函数编写规范就是采用这种写法,无需引入其他更通用的基类。

内容的提问来源于stack exchange,提问作者Jonas Hjulstad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:54:04