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

如何用模板统一实现Eigen复矩阵、向量及复数的共轭操作?

模板化统一处理Eigen矩阵与std::complex的共轭操作

方案1:重载辅助函数实现(兼容C++11及以上)

通过定义适配不同类型的共轭辅助函数,再封装模板化的bc函数,实现代码复用:

#include <complex>
#include <Eigen/Core>

// 适配Eigen矩阵/向量类型:调用成员函数conjugate()
template <typename Derived>
auto do_conjugate(const Eigen::MatrixBase<Derived>& mat) {
    return mat.conjugate();
}

// 适配std::complex类型:调用std::conj()
template <typename T>
std::complex<T> do_conjugate(const std::complex<T>& c) {
    return std::conj(c);
}

// 统一逻辑的模板bc函数
template <typename T>
T bc(int sign, T in) {
    return sign == -1 ? do_conjugate(in) : in;
}

方案2:constexpr if分支判断(C++17及以上)

如果项目支持C++17,可直接在模板函数内通过编译时类型判断分支处理:

#include <complex>
#include <Eigen/Core>
#include <type_traits>

template <typename T>
T bc(int sign, T in) {
    if (sign != -1) {
        return in;
    }
    
    if constexpr (std::is_same_v<T, std::complex<double>>) {
        return std::conj(in);
    } else {
        // 匹配所有Eigen矩阵/向量类型
        return in.conjugate();
    }
}

说明

两种方案都能彻底消除重复代码:

  • 方案1通过重载机制自动匹配不同类型的共轭实现,兼容性更广;
  • 方案2利用C++17的编译时分支特性,代码结构更紧凑。

调用时无需区分传入的是Eigen矩阵、向量还是std::complex<double>,也不需要额外中间结构或.value()调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:42:43