如何用Eigen实现矩阵行与对应列乘积的循环向量化替代逐元素循环
Eigen实现逐行与对应列的点积向量化
你需要的是对矩阵A的每一行和矩阵B的对应列做点积,将结果存入D的对应行。你尝试的rowwise()+colwise()广播方式不可行,因为Eigen没有为这种广播组合定义对应的乘法运算符。
解决方案
方法一:利用矩阵乘法的主对角线
A * B的(i,i)位置元素恰好是A.row(i)和B.col(i)的点积,因此可以直接取结果矩阵的主对角线:Eigen::Matrix<N, 1> D = (A * B).diagonal();注意:该方法会生成一个N×N的中间矩阵,当N很大时会占用大量内存,可能影响性能。
方法二:高效的逐行点积(推荐)
将B转置后,用rowwise().dot()对A的每一行和转置后B的对应行做逐行点积,无需生成大的中间矩阵:Eigen::Matrix<N, 1> D = A.rowwise().dot(B.transpose());这种方式内存开销仅为O(N),且能充分利用Eigen的向量化优化,适合N较大的粒子滤波器场景。
两种方法都能完全替代你原有的循环逻辑,实现向量化加速。
内容的提问来源于stack exchange,提问作者rocklegend
相关产品推荐
相关产品推荐

