如何用Eigen实现无循环的列操作求和生成矩阵?
问题:Eigen能否无循环实现矩阵列向量外积累加?
现有代码通过循环累加矩阵a的列向量与矩阵b对应列向量的转置乘积来生成矩阵m,请问是否可以使用Eigen实现无循环的等价操作?原代码如下:
Matrix3Xf a, b; Matrix3f m; m.setZero(); for (size_t i = 0; i < a.cols(); ++i) { m += a.col(i) * b.col(i).transpose(); }
回答
当然可以,你这段循环做的事情本质上就是矩阵乘法a * b.transpose()——矩阵乘法的定义就是把左矩阵的每一列和右矩阵的每一行(也就是原矩阵对应列的转置)做外积,然后累加所有结果。
直接用Eigen的矩阵乘法就能替代循环,代码更简洁,而且Eigen会自动做优化,效率也更高:
Matrix3Xf a, b; Matrix3f m = a * b.transpose();
如果需要保留初始置零再累加的逻辑(比如m之前还有其他值),也可以写成:
m.setZero(); m += a * b.transpose();
内容的提问来源于stack exchange,提问作者atb
相关产品推荐
相关产品推荐

