使用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计算的最有效方法是什么?
2 回答
(A.transpose() * A).diagonal()
的情况由Eigen明确处理,以强制对嵌套在对角线视图中的产品表达式进行惰性评估 . 因此,仅计算所需的对角线系数n
.也就是说,按照Eric的说法调用
A.colwise().squaredNorm()
更简单 .这将做你想要的 .
https://eigen.tuxfamily.org/dox/group__QuickRefPage.html