gpt4 book ai didi

c++ - 从 Eigen::CwiseBinaryOp 转换为 MatrixXd 导致段错误

转载 作者:行者123 更新时间:2023-11-28 07:10:00 27 4
gpt4 key购买 nike

我正在编写一个库,将 Eigen 表达式模板存储为成员变量,以执行它需要执行的复杂计算。但是,似乎我无法存储或返回这些表达式模板,除非它们在 MatrixXd 或类似工具中直接转换。这迫使每一步都临时保存,破坏了整个设计的效率。

这是导致问题的一个简短示例。 Holder 只是持有一个 Eigen 矩阵,而 Summer 取两个 holder 并在调用 get() 时输出它们持有的两个矩阵的和。当求和表达式模板被评估为矩阵时,随后的测试失败(段错误或 std::bad_alloc)。

包含文件

#ifndef PB_SIMPLE_H
#define PB_SIMPLE_H

#include <Eigen/Dense>

template <class EigenType>
class Holder {
public:
typedef EigenType result_type;

private:
result_type in_;

public:
Holder(const EigenType& in) : in_(in) {}
result_type get() const { return in_; }
};

template <class HoldLeft, class HoldRight>
class Summer {
public:
typedef const typename Eigen::CwiseBinaryOp<
Eigen::internal::scalar_sum_op<double>,
const typename HoldLeft::result_type,
const typename HoldRight::result_type> result_type;
// typedef Eigen::MatrixXd result_type;
private:
HoldLeft left_;
HoldRight right_;

public:
Summer(const HoldLeft& left, const HoldRight& right)
: left_(left), right_(right) {}

result_type get() const { return left_.get() + right_.get(); }
};

typedef Holder<Eigen::MatrixXd> MatrixHolder;
typedef Summer<MatrixHolder, MatrixHolder> MatrixSummer;

#endif /* PB_SIMPLE_H */

简单测试

#include "PbSimple.h"

#include <Eigen/Dense>

int main(int, char * []) {
const unsigned int szx=10,szy=3;
Eigen::MatrixXd x(Eigen::MatrixXd::Constant(szx,szy,1));
MatrixHolder vx(x);
Eigen::MatrixXd y(Eigen::MatrixXd::Constant(szx,szy,2));
MatrixHolder vy(y);
MatrixSummer vsum(vx,vy);
auto expr = vsum.get();
MatrixHolder vz(expr); //force evaluation of sum into new matrix, fails here
return 0;
}
  • 在包含文件中,如果您改用注释掉的 typedef,则效果很好。
  • 我怀疑问题是由于悬空引用引起的,但无法证明这一点。

最佳答案

这是因为 Holder::get 返回矩阵的一个临时拷贝。然后这个临时值被Summer::get返回的CWiseBinaryOp对象存储为const引用,然后这个临时值被删除,最后当expr > 得到评估,expr 正在引用已删除的对象。您可以通过使 Holder::get 返回对矩阵的 const 引用来解决此问题。

关于c++ - 从 Eigen::CwiseBinaryOp 转换为 MatrixXd 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21161392/

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