c++ - 初始化动态矩阵时的特征误差
问题描述
我正在尝试从包含一些简单的笛卡尔点结构的向量中填充特征矩阵(动态行,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;
解决方案
据我了解,您正在尝试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;
}
推荐阅读
- java - MicroProfile 休息客户端不工作
- c - gcc 的 -fstack-protector 选项如何防止堆栈粉碎?
- netsuite - Netsuite Suitescript 参考错误选择图未定义
- javascript - How to pass argument in middle of promise chain?
- sql - 更新语句检索不正确的值
- multithreading - 多个线程写入一个LinkedHashMap时,最后一个线程添加的键值对只保留一个
- ios - seekTo youtube Api 斯威夫特
- javascript - 尝试 JSON.parse 来自 Django 的序列化数据
- javascript - 使用数组查找匹配项的“For”循环不执行
- asp.net - 从桌面应用程序登录 Google Oauth2 网络?