c++ - 在 Eigen 中使用 unaryExpr 进行逐元素运算

标签 c++ eigen eigen3

我正在尝试编写一个函数,该函数采用复值 vector 并以 double 计算元素的角度。我的代码如下:

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

class Arg {
public:
    double operator()(std::complex<double> a) const
    {
        return std::arg(a);
    }
};

template <typename DerivedA, typename DerivedB>
void ArgumentComputer(const Eigen::MatrixBase<DerivedA> &mat, const Eigen::MatrixBase<DerivedB> &_arg)
{

    Eigen::MatrixBase<DerivedB>& arg = const_cast<decltype(arg)>(_arg);

    // 1st try:
    //arg = mat.unaryExpr(std::ptr_fun(std::arg<double>));

    //error: no matching function for call to ‘ptr_fun(<unresolved overloaded function type>)’

    // 2nd try:
    // arg = mat.unaryExpr(Arg{});

    // error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY

    // 3rd try:
    arg = mat.unaryExpr(Arg{}).template cast<double>();

    // error: invalid static_cast from type ‘const std::complex<double>’ to type ‘double’
    // return static_cast<NewType>(x);


}

int main()
{

    Eigen::MatrixXcd myMat = Eigen::MatrixXcd::Random(3, 3);
    Eigen::MatrixXd Arg_myMat(3, 3);

    ArgumentComputer(myMat, Arg_myMat);

    std::cout << myMat << std::endl;
    std::cout << Arg_myMat << std::endl;

    return 0;
}

我第一次尝试使用ptr_fun,但我猜在解析类型时有问题。然后我尝试编写一个类作为仿函数。在这种情况下,我收到错误消息说我需要进行转换。当我进行转换时,出现 static_cast 错误。所有这三种情况都在代码中给出,编译器消息也作为注释添加。我的错误是什么,我应该怎么写才正确?

最佳答案

您的问题是您在不知不觉中尝试将复数转换为实数。您会看到 std::arg 的返回类型作为double并假设这就是你所拥有的,但实际上它是一个 std::complex<double>因为 mat输入(MatrixXcd)。您的代码可能如下所示:

// 1st try:
//arg = mat.unaryExpr(std::ptr_fun(std::arg<double>)).real(); // Should work but doesn't resolve the template for some reason

// 2nd try:
arg = mat.unaryExpr(Arg{}).real(); // works

我不是 100% 确定为什么您的第一次尝试不起作用。您还可以使用函数代替仿函数:

double myArg(std::complex<double> a)
{
    return std::arg(a);
}
//...
arg = mat.unaryExpr(std::ptr_fun(myArg)).real();

关于c++ - 在 Eigen 中使用 unaryExpr 进行逐元素运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34336042/

相关文章:

java - Android (ART) 崩溃并出现错误 JNI DETECTED ERROR IN APPLICATION : jstring is an invalid local reference

c++ - 将Eigen库与OpenCV 2.3.1一起使用

c++ - 在 Qiana 上构建 opencv 失败

c++ - 线程可以在对内核的系统调用中被抢占吗?

c++ - 未评估上下文中的 "Cannot call member function ... without object"- GCC 错误?

c++ - 如何使用字符串参数在Delphi中调用C++ DLL?

c++ - Eigen C++ : How can I fixed the values after a random matrix initialization?

c++ - 一般产品中的特征自动类型推导

eigen - 在 Eigen 中混合标量类型

c++ - 初始化 Eigen::Map 的 std::array