首页 文章

对角矩阵的特征使用

提问于
浏览
4

使用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 回答

  • 6

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

    也就是说,按照Eric的说法调用 A.colwise().squaredNorm() 更简单 .

  • 4

    这将做你想要的 .

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

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

    Eigen提供了几种简化方法,例如:minCoeff(),maxCoeff(),sum(),prod(),trace(),norm(),squaredNorm()*,all()和any() . 所有还原操作都可以按矩阵,逐列或逐行进行 .

相关问题