对角矩阵的特征使用

Eigen use of diagonal matrix

本文关键字:特征      更新时间:2023-10-16

使用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 矩阵(可能是数百万个元素)。

本征是否足够聪明,可以只计算我需要的系数? 在每列上实现平方范数计算的最有效方法是什么?

(A.transpose() * A).diagonal()的情况由 Eigen 显式处理,以强制对嵌套在对角线视图中的产品表达式进行延迟计算。因此,将仅计算所需的n对角线系数。

也就是说,正如埃里克所指出的那样,称呼A.colwise().squaredNorm()更简单。

这将做你想要的。

squaredNorms = A.colwise().squaredNorm();

https://eigen.tuxfamily.org/dox/group__QuickRefPage.html

Eigen 提供了几种归约方法,例如:minCoeff() 、maxCoeff()、sum() 、prod()、trace() *、norm() *、squaredNorm() *、all() 和 any()。所有归约操作都可以按矩阵、按列或按行完成。