gpt4 book ai didi

c++ - Eigen库是在修改C++语法吗

转载 作者:行者123 更新时间:2023-11-28 01:14:01 24 4
gpt4 key购买 nike

我最近一直在使用 Eigen,虽然一切都有意义,但我对这个库如何摆脱它使用的奇怪语法感到有点困惑。

例如,当定义一个矩阵时,你应该这样做:

MatrixXd m(2,2); //defines a 3 x 4 matrix
m(0, 0) = 1;
m(0, 1) = 2;
m(1, 0) = 3;
m(1, 1) = 4;

或者你可以这样做:

Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;

虽然这些命令在概念上对我来说很有意义,但我很好奇它们对编译器有何意义。我以为 << 是用于位移位的,括号符号是用于输入参数函数之类的,而不是用于通过数组之类的矩阵结构进行解析。

我使用 C++ 的时间还不够长,无法理解所有这些语法,但我想知道 Eigen 的作者是否以某种方式定义了自定义语法或其他东西。

最佳答案

在这两个代码块中都有一些运算符重载。

在第一个代码块中,行MatrixXd m(2,2);正在创建对象,因为它是声明并且我们有类型 MatrixXd那里。因此,语法 m(i, j)必须是对接收两个参数的构造函数的调用(它也可以是接收更多参数的构造函数,只要其他参数具有默认值)。

第一个代码块中的其他行没有调用构造函数,因此语法为 m(i, j)意味着调用 operator()(i, j) 的实现.从技术上讲,类似于 operator()(int i, int j) 的东西.综上所述,第一个代码块只需要一个运算符重载,而且是人们经常实现的。

第二个代码块对我来说更像是魔法。零件m << Number表示 m 的类型,即 Matrix3f , 对 operator<< 有过载.然后我认为无论operator<<的类型返回1 必须实现逗号运算符以允许 1, 2, 3, ...部分。逗号运算符很少使用,它是重载恕我直言的最晦涩的运算符。总之,第二个代码块需要两个运算符重载,其中一个比较晦涩。是的,这很神奇。


1 它可能是对 m 的引用因此是Matrix3f或者它甚至可以是由 Eigen 作者创建的完全不同的类型,以允许这种漂亮的语法来初始化矩阵。

关于c++ - Eigen库是在修改C++语法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59292509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com