gpt4 book ai didi

c++ - 在 Eigen 中使用 CwiseBinaryOp 时如何摆脱 "invalid use of incomplete type"

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:12 33 4
gpt4 key购买 nike

我正在尝试用我自己的函数替换 Eigen 中 3x1 vector 求和的函数。例如,

Matrix<float, 3, 1> q, q2, q3;
q.setRandom();
q2.setRandom();
q3.setRandom();
q3 = q + q2;

我希望q3是我自己的函数计算出来的。

由于 Eigen 实际上是通过 operator= 而不是 operator+ 来计算和,而 operator+ 只是返回一个 CwiseBinaryOp 对象,所以我需要重载 operator=。

现在我正在使用 EIGEN_MATRIX_PLUGIN 宏将我的代码添加到 Eigen 的 Matrix.h 中:

inline Matrix<float, 3, 1> &operator=(
const CwiseBinaryOp<internal::scalar_sum_op<float>, const Matrix<float, 3, 1>, const Matrix<float, 3, 1>>
&op) {
float *t = m_storage.data();
op.lhs(); //error here
return *this;
}

我自己的函数需要访问指向q、q2和q3数据的指针。但是当我尝试通过 CwiseBinaryOp 对象访问 q 和 q2 的数据时出现以下错误。

In file included from /home/tong/Program/Eigen/Eigen/src/Core/Matrix.h:340:0,
from /home/tong/Program/Eigen/Eigen/Core:294,
from /home/tong/Program/Eigen/Eigen/Dense:1,
from /home/tong/ClionProjects/EigenTest/main.cpp:7:
/home/tong/ClionProjects/EigenTest/MatrixAddon.h: In member function ‘Eigen::Matrix<float, 3, 1>& Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::operator=(const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<float>, const Eigen::Matrix<float, 3, 1>, const Eigen::Matrix<float, 3, 1> >&)’:
/home/tong/ClionProjects/EigenTest/MatrixAddon.h:12:7: error: invalid use of incomplete type ‘const class Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<float>, const Eigen::Matrix<float, 3, 1>, const Eigen::Matrix<float, 3, 1> >’
op.lhs();
^
In file included from /home/tong/Program/Eigen/Eigen/Core:252:0,
from /home/tong/Program/Eigen/Eigen/Dense:1,
from /home/tong/ClionProjects/EigenTest/main.cpp:7:
/home/tong/Program/Eigen/Eigen/src/Core/util/ForwardDeclarations.h:89:65: error: declaration of ‘const class Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<float>, const Eigen::Matrix<float, 3, 1>, const Eigen::Matrix<float, 3, 1> >’
template<typename BinaryOp, typename Lhs, typename Rhs> class CwiseBinaryOp;

我想知道为什么会出现这个错误以及如何摆脱它。

最佳答案

我不确定你这边出了什么问题,但我通过以下方式让它工作:

MatrixAddons.h

这是包含您打算放置在 Eigen::Matrix 类中的 operator= 定义的 header 。

Matrix<float, 3, 1>& operator=(
const CwiseBinaryOp<internal::scalar_sum_op<float>, const Matrix<float,
3, 1>, const Matrix<float, 3, 1>>& op)
{
float *t = m_storage.data();
op.lhs();
return *this;
}

config.h

定义 EIGEN_MATRIX_PLUGIN 以指向 MatrixAddons.h header 的 header 。

#define EIGEN_MATRIX_PLUGIN "MatrixAddons.h"

main.cpp

用于测试 expanded Eigen::Matrix 类的 C++ 源代码。

#include <iostream>
#include "config.h"
#include "Eigen/Core"

int main()
{
Eigen::Matrix<float, 3, 1> q1, q2, q3;
q1.setRandom();
q2.setRandom();
q3 = q1 + q2;
std::cout << q3 << std::endl;
}

一些调试(或从新的 operator= 记录)显示新添加的运算符作为 q3 = q1 + q2 语句的一部分被调用。

关于c++ - 在 Eigen 中使用 CwiseBinaryOp 时如何摆脱 "invalid use of incomplete type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33286318/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com