C++ 对角矩阵的特征使用

C++ 对角矩阵的特征使用,c++,performance,eigen,C++,Performance,Eigen,使用Eigen,我有一个矩阵x3xd(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(

使用Eigen,我有一个矩阵x3xd(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矩阵(可能有一百万个元素),而我只需要对角线

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

这将满足您的要求

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

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

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


这就是说,调用
A.colwise().squaredNorm()
更简单,Eric也提到了这一点。

那么(使用)然后再进行部分缩减如何?如果启用Eigen的MKL支持,这种情况会改变吗?似乎MKL gemm()会中断延迟求值。不,因为这里的快捷方式是在调用类似gemm的例程(Eigen的内置或任何blas后端)之前应用的,感谢对延迟求值的解释和使用colwise的更简单方法!正是我需要的