Eigen中1-a.array()的返回类型及(1-a.array()).cwiseProduct(b)的正确写法
嘿,我来帮你搞定这个Eigen的编译问题~
问题根源
首先得搞清楚类型转换的核心问题:当你执行1 - a.array()时,a.array()把VectorXd转换成了ArrayXd类型,和标量1做减法运算后,返回的结果依然是ArrayXd。而cwiseProduct是Eigen里Matrix/Vector类的专属成员函数,Array类型根本没有这个方法,所以直接链式调用就会触发编译错误。
几种正确的写法
这里给你三种可行的解决方案,按需选择:
把Array转回Vector再调用cwiseProduct
用.matrix()方法把运算后的Array类型转回VectorXd,就能正常调用cwiseProduct了:int main() { VectorXd a(3),b(3); a << 1,2,3; b << 2,3,4; cout << (1 - a.array()).matrix().cwiseProduct(b) << endl; // 现在可以正常运行 return 0; }用Array类的逐元素乘法运算符
Array类本身就支持用*做逐元素乘法,所以可以把b也转换成Array类型,直接用运算符完成操作:int main() { VectorXd a(3),b(3); a << 1,2,3; b << 2,3,4; cout << ((1 - a.array()) * b.array()) << endl; // 更符合Array的使用习惯 return 0; }先赋值给Vector变量再操作
就是你测试代码里已经验证过的方法,虽然多了一步赋值,但逻辑简单易懂:int main() { VectorXd a(3),b(3); a << 1,2,3; b << 2,3,4; a = 1 - a.array(); cout << a.cwiseProduct(b) << endl; // 已验证可行 return 0; }
小补充:Matrix和Array的区别
Eigen里的Matrix(包括Vector)和Array是两套独立的体系:
- Matrix类:主打线性代数运算(比如矩阵乘法、点积、矩阵分解等),
cwiseProduct是它专门用来做逐元素乘法的方法。 - Array类:主打逐元素的数值运算(比如逐元素加减乘除、三角函数、逻辑比较等),直接用常规运算符就能实现逐元素操作。
内容的提问来源于stack exchange,提问作者Mindong
相关产品推荐
相关产品推荐

