对角矩阵的特征使用

Bas*_*oud 4 c++ performance eigen

使用Eigen,我有一个Matrix3Xd(3行,n列).我想得到所有列的平方范数

更清楚,让我说我有

Matrix3Xd a =
1    3    2    1
2    1    1    4
Run Code Online (Sandbox Code Playgroud)

我想得到每列的平方范数

squaredNorms =
5    10    5    17
Run Code Online (Sandbox Code Playgroud)

我想利用矩阵计算而不是通过for循环自己进行计算.

我的意思是

squaredNorms = (A.transpose() * A).diagonal()
Run Code Online (Sandbox Code Playgroud)

这有效,但我担心性能问题:A.transpose() * A当我只需要对角线时,它将是一个nxn矩阵(可能是数百万个元素).

Eigen足够聪明,只计算我需要的系数吗?在每列上实现squareNorm计算的最有效方法是什么?

gga*_*ael 6

(A.transpose() * A).diagonal()Eigen明确处理该情况,以强制对嵌套在对角线视图中的产品表达式进行惰性求值.因此,仅n计算所需的对角线系数.

也就是说,A.colwise().squaredNorm()如Eric 所说,打电话更简单.

  • nope因为这里在调用gemm-like例程之前应用了快捷方式(Eigen的内置函数或者后端的任何内容) (2认同)