\(A\)と\(A\)の転地の積のトレースはフロベニウスノルムの二乗と等しくなる。つまり
\begin{align}
\mathrm{tr} (A A^{T}) = \mathrm{tr} (A^{T} A) = \sum_{i=1}^{n}\sum_{j=1}^{m} a_{ij}^2
\end{align}
フロベニウスノルムは
\begin{align}
\| A \|_F = \sqrt{\sum_{i=1}^{n}\sum_{j=1}^{m} a_{ij}^2}
\end{align}
これが成り立つことをEigenで試す。
実行結果
304
304
304
フロベニウスノルム->17.4356
ソースコード。
#include <iostream>
#include "../Eigen/Dense"
int main() {
const int n = 3;
const int m = 3;
double Fsum = 0;
Eigen::MatrixXf A(n,m), B1(n, m), B2(n, m);
A << 1, 2, 3, 4, 5, 6, 7, 8, 10;
B1 = A * A.transpose();
B2 = A.transpose() * A;
for (int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
Fsum += std::pow(A(i, j), 2);
}
}
std::cout << B1.trace() << std::endl;
std::cout << B2.trace() << std::endl;
std::cout << Fsum << std::endl;
std::cout << std::endl;
std::cout << "フロベニウスノルム->" << sqrt(Fsum) << std::endl;
return 0;
}
コメント