对角矩阵的特征使用

时间:2016-06-16 15:38:51

标签: c++ performance eigen

使用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 个答案:

答案 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() 。所有还原操作都可以按矩阵,逐列或逐行进行。