フロベニウスノルムは
\begin{align}
\| A \|_{F}=\sqrt{\sum_{i=1}^{m} \sum_{j=1}^{n} \left |a_{ij} \right |}
\end{align}
で計算できる。一次元配列に行列を放り込んで計算してみた。
実行結果
1,1,1,1,
1,1,1,1,
2.82843
ソースコード
#include <iostream>
void show(double*, int, int);
double Fnorm(double* x, int n, int m);
int main() {
int m = 4, n = 2;
double sum = 0;
double* x;
x = new double[m * n];
for (int i = 0; i < m * n; i++) {
x[i] = 1;
}
show(x, n, m);
std::cout << std::endl;
std::cout << Fnorm(x, n, m);
}
double Fnorm(double* x, int n, int m) {
double norm = 0;
for (int i = 0; i < n * m; i++) {
norm += std::pow(x[i], 2);
//std::cout << norm << std::endl;
}
std::cout << std::endl;
return std::sqrt(norm);
}
void show(double* x,int n,int m) {
int count = 0;
for (int i = 0; i < m * n; i++) {
count += 1;
std::cout << x[i] << ",";
if (count == m) {
std::cout << std::endl;
count = 0;
}
}
}
コメント