c++ - Eigen 矩阵的静态 reshape

标签 c++ eigen

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

更多信息: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());

最佳答案

最后一行确实是在做一个拷贝,所以你可以使用一个 Map 如下:

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

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

关于c++ - Eigen 矩阵的静态 reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28736205/

相关文章:

c++ - QGraphicsItem::boundingRect() 是否应该包含子边界矩形?

c++ - 程序继续崩溃 [Project Euler #21]

c++ - 用于 DHE 交换的 OpenSSL 证书生成

c++ - Eigen 3 方阵除以列阵

c++ - Eigen 实例包含另一个持有固定大小 Eigen 对象的实例

c++ - 任务栏扩展(如联系人)

c++ - 在 C++ STL 类型的静态实例上使用 OpenMP threadprivate 指令

c# - 使用Eigen矩阵库进行C++代码转换

c++ - 在 Eigen(c++) 中使用 noalias 之前是否需要检查指针

c++ - 使用 Eigen 就地进行 LDLT 分解