特征矩阵的静态重构

时间:2015-02-26 06:53:46

标签: c++ eigen

我正在尝试使用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());

1 个答案:

答案 0 :(得分:6)

最后一行确实正在复制,因此您可以使用以下地图:

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

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