调整 Eigen::Ref 大小的解决方法

2023-12-24

我想使用 Eigen::Ref 来使用 Eigen::Matrix 参数来实现非模板函数。我的问题是,在这些函数中,我可能必须调整 Eigen::Ref 引用的矩阵的大小。我知道,一般而言,不应调整 Eigen::Ref 的大小,因为它可以映射到表达式或矩阵块,但就我而言,我确信 Eigen::Ref 背后是 Eigen::Matrix。

为了说明这一点:

#include "Eigen/Dense"

void add(Eigen::Ref<Eigen::MatrixXd> M, const Eigen::Ref<const Eigen::MatrixXd> &A, const Eigen::Ref<const Eigen::MatrixXd> &B) {
  M=A+B;
}

int main() {
  Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor, 32, 32> M(2,3);
  Eigen::Matrix<double, 2, 2> A;
  Eigen::Matrix<double, 2, 2> B;

  add(M,A,B);
}

在运行时给出:

void Eigen::DenseBase<Derived>::resize(Eigen::Index, Eigen::Index) [with Derived = Eigen::Ref<Eigen::Matrix<double, -1, -1> >; Eigen::Index = long int]: Assertion `rows == this->rows() && cols == this->cols() && "DenseBase::resize() does not actually allow to resize."' failed.

我试图欺骗它:

void add(Eigen::Ref<Eigen::MatrixXd> M, const Eigen::Ref<const Eigen::MatrixXd> &A, const Eigen::Ref<const Eigen::MatrixXd> &B) {
  Eigen::Ref<Eigen::Matrix<double,2,2>> MM(M);
  MM=A+B;
}

但我在运行时得到:

Eigen::internal::variable_if_dynamic<T, Value>::variable_if_dynamic(T) [with T = long int; int Value = 2]: Assertion `v == T(Value)' failed.

那么,我能做些什么来处理这个问题呢?在 Eigen 文档中,使用 MatrixBase 作为参数的模板函数解决了调整大小的问题,但对于 Eigen::Ref?


这是一个使用成员函数指针和残酷转换的黑客解决方案:

#include <iostream>
#include <Eigen/Core>
template<class MatrixType>
struct ResizableRef
{
    typedef typename MatrixType::Scalar Scalar;
    class MatrixDummy;
    typedef void (MatrixDummy::*ResizeFunctor)(Eigen::Index rows, Eigen::Index Cols);
    typedef Scalar* (MatrixDummy::*DataGetter)();

    MatrixDummy *m;
    const ResizeFunctor resizer;
    const DataGetter getData;

    template<class Derived>
    ResizableRef(Eigen::MatrixBase<Derived>& M)
      : m(reinterpret_cast<MatrixDummy*>(&M))
      , resizer(reinterpret_cast<ResizeFunctor>((void (Derived::*)(Eigen::Index, Eigen::Index)) &Derived::resize))
      , getData(reinterpret_cast<DataGetter>((Scalar* (Derived::*)()) &Derived::data))
    { }

    template<class Derived>
    ResizableRef& operator=(const Eigen::EigenBase<Derived>& other)
    {
        (m->*resizer)(other.rows(), other.cols());
        MatrixType::Map((m->*getData)(), other.rows(), other.cols()) = other;
    }
};

void foo(ResizableRef<Eigen::MatrixXd> A)
{
    A = Eigen::Matrix2d::Identity();
}

int main(int argc, char *argv[])
{
    using namespace Eigen;
    MatrixXd A;
    Matrix<double, Dynamic, Dynamic, Eigen::ColMajor, 20, 12> B;
    Matrix<double, 2, Dynamic, Eigen::ColMajor, 2, 4> C;
    Matrix2d D;
    foo(A);
    foo(B);
    foo(C);
    foo(D);

    std::cout << A << "\n\n" << B << "\n\n" << C << "\n\n" << D << '\n';
}

这可能会违反严格的别名规则,我通常建议重新考虑您的设计。然而,它应该可以在没有不必要的运行时分配的情况下工作,并且可以安全地防止某些错误的用法:

    MatrixXf fail1;
    Matrix3d fail2;
    foo(fail1); // fails at compile time
    foo(fail2); // fails at runtime
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调整 Eigen::Ref 大小的解决方法 的相关文章

随机推荐

  • 将控制台应用程序转换为 Windows 服务

    我正在尝试将生成 pdf 报告的控制台应用程序转换为 Windows 服务 我的代码如下 我的方向正确吗 我安装了此服务并且启动 停止工作正常 但没有生成报告 控制台应用程序本身就可以很好地生成 Output pdf 我的目标是在服务启动时
  • Java 11 应用程序作为轻量级 docker 镜像

    受到提问的启发为什么 Java 11 基础 Docker 镜像如此大 openjdk 11 jre slim https stackoverflow com questions 53375613 我发现这个话题在Java世界里还没有定论 A
  • C# 中的 Oracle、绑定变量和 ID IN (1, 2, 3) 等查询

    我正在寻找以下 Java 技术的 C ODAC 改编 其中代码能够将数字数组 数组大小可以变化 绑定到非 PL SQL 中SELECT语句 然后在 a 中使用结果数组WHERE ID IN 风格检查 http rafudb blogspot
  • 我应该从源代码编译一个库吗?

    我正在开发一个将在定制的 基于 debian 的 Linux 系统上运行的应用程序 我们有一个工具链 以便我们可以为目标系统交叉编译应用程序 这样我们就不必依赖于我们进行编译的主机操作系统 而不是目标操作系统 但是 我不确定我们是否应该从源
  • 具有多种 monad 类型的 Haskell do 子句

    我正在 Haskell 中使用一个名为的图形库三便士 GUI http hackage haskell org package threepenny gui 在这个库中 主函数返回一个UI http hackage haskell org
  • 取np.average而忽略NaN?

    我有一个形状为 64 17 的矩阵 对应于时间和纬度 我想取加权纬度平均值 我知道 np average 可以做到这一点 因为与我用来平均经度的 np nanmean 不同 可以在参数中使用权重 但是 np average 不会像 np n
  • 将包含 NSString 的 NSArray 转换为 NSString

    所以 我有一个包含 NSString 的 NSArray 如何将 NSArray 转换为 NSString 用换行符分隔它们 Use 通过字符串连接的组件 https developer apple com library mac docu
  • 使用 R 进行多线程?

    正在阅读R 项目 http www r project org 网站上 有一些 不清楚的 关于 R 多线程的参考 但尚不清楚基础产品和CRAN http cran cnr berkeley edu 库已编译 革命分析 http www re
  • Bootstrap:如何在一行上创建一系列 div 隐藏溢出的 div

    我有一个使用 bootstrap 构建的网站 我想使用 jquery dragscroll 插件创建一个带有可滑动标题的表格 但保留内置的流体网格 bootstrap 所以我想创建表的标题 并且我使用以下 HTML div class ro
  • 发送ajax请求而不等待应答

    我想发出一个ajax请求来发送一些信息 并在发送后立即 如果我收到错误 成功并不重要 进行重定向 无需等待服务器响应 我想知道我是否做类似的事情 ajax url myurl timeout 500 success function doc
  • 未找到名称为“ARTShape”的视图的组件

    只是试图生成一个在 React Native 中使用 ART 对象的 hello world 我得到了上述异常 就好像库的一部分没有链接一样 我刚刚添加了以下代码 import AppRegistry StyleSheet Text Vie
  • 为 QHeaderView 提供的类实现paintSection

    protected virtual void paintSection QPainter painter const QRect rect int logicalIndex const QHeaderView paintSection pa
  • 针对页面修改黑客的 Rails 集成测试?

    我正在使用 Capybara 1 1 2 Rails 3 1 3 rspec rails 2 9 0 和 Ruby 1 9 3p0 假设一个应用程序具有标准用户和 account admin 用户 标准用户可以创建另一个标准用户 但标准用户
  • Angular2 RC5 默认 http 标头

    在 RC4 中可以扩展 Http 或 BaseRequestOptions 并向所有 http 请求添加默认标头 像这儿如何在 Angular2 中设置默认 HTTP 标头 https stackoverflow com questions
  • Java try-catch 模式中的 try-finally

    每当我需要在 Java 中获取资源 然后保证资源被释放时 可能会抛出异常 我会使用以下模式 try Resource resource null try resource new Resource Use resource finally
  • 如何在Windows Azure云服务器上转发端口

    您好 我刚刚尝试了 Windows Azure 云服务器 下载并运行 apache 它可以在本地主机上运行 但无法从互联网访问 我应该端口转发做一些特别的事情才能使 cloudapp net 像 Web 服务器一样工作 我缺少什么 你究竟尝
  • 使用 Javascript 从 Google Analytics API 获取综合浏览量

    我在使用 JavaScript 从 Google Analytics API 获取数据时遇到问题 我似乎无法获取任何东西 但可以说它是一些基本的东西 比如页面浏览量 我在用分析 js https developers google com
  • 从轨道中的整数或小数中去除逗号

    整数或小数是否有等效的 gsub gsub 应该使用整数吗 基本上我只是想将十进制输入到 ruby 形式以及用户能够使用逗号的内容 例如 我希望用户能够输入 1 000 99 我尝试过使用 before save strip commas
  • SQL WHERE 条件不等于?

    是否可以否定 where 子句 e g DELETE FROM table WHERE id 2 你可以这样做 DELETE FROM table WHERE id NOT IN 2 OR DELETE FROM table WHERE i
  • 调整 Eigen::Ref 大小的解决方法

    我想使用 Eigen Ref 来使用 Eigen Matrix 参数来实现非模板函数 我的问题是 在这些函数中 我可能必须调整 Eigen Ref 引用的矩阵的大小 我知道 一般而言 不应调整 Eigen Ref 的大小 因为它可以映射到表