使用 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 计算的最有效方法是什么?

最佳答案

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

也就是说,正如 Eric 所指出的那样,调用 A.colwise().squaredNorm() 更简单。

关于c++ - 对角矩阵的特征使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37863668/

10-12 19:13