首页 > 解决方案 > 初始化动态矩阵时的特征误差

问题描述

我正在尝试从包含一些简单的笛卡尔点结构的向量中填充特征矩阵(动态行,2 列,双精度),但是,在使用 operator 时出现错误<<

最小失败示例(使用 MSVC 2017):

#include <Eigen/Dense>
#include <vector>

struct point {
    double x, y;
};

int main() {

    std::vector<point> points = {
        point{0.0, 0.0},
        point{0.5, 0.0},
        point{0.0, 1.0},
        point{0.5, 1.0},
    };

    typedef Eigen::Matrix<double, Eigen::Dynamic, 2> CoordMatrix;
    CoordMatrix X;

    for (auto& p : points)
        X << p.x, p.y;

    return 0;
}

运行此程序时,我在行中收到一条错误X << point.x, point.y;消息:“没有运算符与这些操作数匹配”(在调试模式下<<尝试传递时也会抛出此错误)。X << 0.0, 0.0;

标签: c++eigen

解决方案


据我了解,您正在尝试X使用每行中的值初始化矩阵,其中包含来自早期向量的一个点的坐标。你不能那样做,看这里

Eigen 提供了一个逗号初始化语法,允许用户轻松设置矩阵、向量或数组的所有系数。简单地列出系数,从左上角开始,从左到右,从上到下。需要事先指定对象的大小。如果你列出的系数太少或太多,Eigen 会抱怨。

上面清楚地表明您的右侧需要将尺寸与左侧匹配。在您的情况下,您可能需要逐个元素地复制向量元素。就像是:

CoordMatrix X(points.size(), 2); // reserving rigth storage for the matrix
for (auto i = 0u; i < points.size(); ++i) {
  X(i, 0) = points[i].x;
  X(i, 1) = points[i].y;
}

推荐阅读