使用Eigen,我有一个Matrix3Xd(3行,n列)。我想得到所有列的平方范数
更清楚,让我说我有
Matrix3Xd a =
1 3 2 1
2 1 1 4
我想得到每列的平方范数
squaredNorms =
5 10 5 17
我想利用矩阵计算而不是通过for循环进行计算。
我的意思是
squaredNorms = (A.transpose() * A).diagonal()
这很有效,但我担心性能问题:当我只需要对角线时,A.transpose() * A
将是一个nxn矩阵(可能是数百万个元素)。
Eigen是否足以仅计算我需要的系数? 在每列上实现squareNorm计算的最有效方法是什么?
答案 0 :(得分:6)
Eigen明确处理(A.transpose() * A).diagonal()
的情况,以强制对嵌套在对角线视图中的产品表达式进行惰性求值。因此,只计算n
所需的对角线系数。
也就是说,如同Eric所说,调用A.colwise().squaredNorm()
更简单。
答案 1 :(得分:4)
这将做你想要的。
squaredNorms = A.colwise().squaredNorm();
https://eigen.tuxfamily.org/dox/group__QuickRefPage.html
Eigen提供了几种简化方法,例如:minCoeff(),maxCoeff(),sum(),prod(),trace()*,norm()*,squaredNorm()*,all()和any() 。所有还原操作都可以按矩阵,逐列或逐行进行。