Eigen自定义向量逐元素相乘的高效内置实现方法问询
搞定Eigen向量逐元素乘积的高效方法
嘿,你想要的对应位置元素相乘的功能,Eigen其实提供了非常高效的内置实现,完全不用手动写循环~ 你之前试的array()思路方向是对的,可能只是没注意到细节,另外还有更直观的方法:
1. 最直观:用cwiseProduct()函数
这是Eigen专门为矩阵/向量设计的逐元素乘积方法,代码写出来一目了然,完全符合你的需求:
myVector vectorThree = vectorOne.cwiseProduct(vectorTwo);
它会自动遍历两个向量的对应元素相乘,直接生成目标向量vectorThree,尺寸和类型都完美匹配你的myVector定义。
2. 灵活通用:array()转换法
你之前尝试的array()其实没问题,Eigen的Matrix和Array可以互相隐式转换,只要尺寸一致就行。正确的写法应该是:
myVector vectorThree = vectorOne.array() * vectorTwo.array();
当把Matrix转成Array后,*运算符就变成了逐元素乘法(而不是矩阵乘法),计算完成后结果可以自动转回myVector类型,完全符合你的要求。
为什么这两种方法比循环强?
- 性能拉满:Eigen会自动对这些操作做向量化优化(比如生成SIMD指令),比手动写的for循环效率高很多,哪怕是50个元素的向量,编译器也能帮你榨干硬件性能。
- 代码简洁不易错:一行代码搞定,可读性强,还能避免手动循环里可能出现的下标越界、类型不匹配等问题。
- 类型安全:编译器会自动检查两个输入向量的尺寸是否一致,提前帮你规避错误。
如果之前用array()没成功,大概率是没把结果正确赋值给myVector变量,不妨试试上面的写法,绝对比循环香!
内容的提问来源于stack exchange,提问作者AStudent
相关产品推荐
相关产品推荐

