【问题标题】:Static reshape of Eigen matrix特征矩阵的静态重塑
【发布时间】:2015-02-26 06:53:46
【问题描述】:

我正在尝试使用 Eigen 对一些网格数据进行双三次插值,但我不知道如何将 16x1 列向量的系数重塑为 4x4 矩阵。理想情况下,我想在没有任何复制的情况下按照https://bitbucket.org/eigen/eigen/pull-request/41/reshape/diff 的方式做一些事情,但我无法对文档做出正面或反面。或者,地图也可以,但我不知道如何在已经存在的矩阵上使用地图。

更多:http://en.wikipedia.org/wiki/Bicubic_interpolation

/// The inverse of the A matrix for the bicubic interpolation 
/// (http://en.wikipedia.org/wiki/Bicubic_interpolation)
static const double Ainv_data[16*16] = {
     1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    -3,  3,  0,  0, -2, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     2, -2,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0, -3,  3,  0,  0, -2, -1,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  2, -2,  0,  0,  1,  1,  0,  0,
    -3,  0,  3,  0,  0,  0,  0,  0, -2,  0, -1,  0,  0,  0,  0,  0,
     0,  0,  0,  0, -3,  0,  3,  0,  0,  0,  0,  0, -2,  0, -1,  0,
     9, -9, -9,  9,  6,  3, -6, -3,  6, -6,  3, -3,  4,  2,  2,  1,
    -6,  6,  6, -6, -3, -3,  3,  3, -4,  4, -2,  2, -2, -2, -1, -1,
     2,  0, -2,  0,  0,  0,  0,  0,  1,  0,  1,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  2,  0, -2,  0,  0,  0,  0,  0,  1,  0,  1,  0,
    -6,  6,  6, -6, -4, -2,  4,  2, -3,  3, -3,  3, -2, -1, -2, -1,
     4, -4, -4,  4,  2,  2, -2, -2,  2, -2,  2, -2,  1,  1,  1,  1};

Eigen::Matrix<double, 16, 16> Ainv(Ainv_data);

Eigen::Matrix<double, 16, 1> f;
f.setRandom();
Eigen::Matrix<double, 16, 1> alpha = Ainv*f;
// This next line works, but it is making a copy, right?
Eigen::Matrix<double, 4, 4> a(alpha.data());

【问题讨论】:

    标签: c++ eigen


    【解决方案1】:

    最后一行确实是在做副本,所以你可以使用如下的地图:

    Map<Matrix4d,Eigen::Aligned> a(alpha.data());
    

    a 的行为类似于Matrix4d,并且它是可读写的。 Eigen::Aligned 标志告诉 Eigen 您传递给 Map 的指针已正确对齐以进行矢量化。与纯 Matrix4d 的唯一区别是 C++ 类型不一样。

    【讨论】:

    • 有了这个地图调用,是不是也在做副本?或者只是本质上生成一个关于 alpha 矩阵的内部数据的视图?
    • 确实,这里没有copy,修改a也会修改alpha
    • 好的,谢谢你,最后我为这部分使用了 STL 解决方案,因为我需要将 Matrix4d 存储在一个结构中并且我一直在对齐错误(我按照说明进行操作),最后我放弃了。这很有帮助
    • 如果您遇到对齐错误,请尝试Map&lt;Matrix4d, Eigen::AutoAlign&gt;(...)。据我了解,这不应该发生在您的示例中,因为 alpha.data() 应该是 16 字节对齐的。但是,如果您编写类似 Map&lt;Matrix4d, Eigen::AutoAlign&gt;(alpha.data()+1) 的内容,您几乎肯定会遇到对齐错误!
    • 不,您应该忽略此模板参数:Map&lt;Matrix4d&gt; 或将其定义为默认值0,例如指定步幅:Map&lt;Matrix4d,0,Stride&lt;&gt; &gt;。原来是AutoAlign==0,但这只是巧合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2011-01-16
    • 1970-01-01
    相关资源
    最近更新 更多