namespace std::linalg {
template<in-matrix InMat, class Scalar>
Scalar matrix_frob_norm(InMat A, Scalar init); // (1)
template<class ExecutionPolicy,
in-matrix InMat,
class Scalar>
Scalar matrix_frob_norm(
ExecutionPolicy&& exec,
InMat A,
Scalar init); // (2)
template<in-matrix InMat>
auto matrix_frob_norm(InMat A); // (3)
template<class ExecutionPolicy, in-matrix InMat>
auto matrix_frob_norm(ExecutionPolicy&& exec, InMat A); // (4)
}
概要
行列のフロベニウスノルムを計算する。
- (1): 逐次実行する。
- (2): 指定された実行ポリシーに応じて実行する。
- (3): (1)で
init
にInMat::value_type
のデフォルト値を与えて逐次実行する。 - (4): (2)で
init
にInMat::value_type
のデフォルト値を与えて、指定された実行ポリシーに応じて実行する。
適格要件
- (1), (2):
decltype(init + abs-if-needed(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))
がScalar
に変換可能。 - (2), (4):
is_execution_policy<ExecutionPolicy>::value
がtrue
効果
- (3), (4):
T
をdecltype(abs-if-needed(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))
とすると、- (3):
matrix_frob_norm(A, T{})
を返す。 - (4):
matrix_frob_norm(std::forward<ExecutionPolicy>(exec), A, T{})
を返す。
- (3):
戻り値
- (1), (2):
A
が $m \times n$ 行列とすると、以下の式の値を返す。
$$ \sqrt{\sum_{i = 0}^{m - 1} \sum_{j = 0}^{n - 1} |\verb|A[|i, j\verb|]||^2 + \verb|init|^2} $$
- (3), (4):
T
をdecltype(abs-if-needed(declval<typename InMat::value_type>()) * abs-if-needed(declval<typename InMat::value_type>()))
とすると、- (3):
matrix_frob_norm(A, T{})
を返す。 - (4):
matrix_frob_norm(std::forward<ExecutionPolicy>(exec), A, T{})
を返す。
- (3):
備考
- (1), (2): もし
InMat::value_type
とScalar
がどちらも浮動小数点数型またはstd::complex
の特殊化で、Scalar
がInMat::value_type
より精度が高い場合、和の各項はScalar
またはより高い精度の型が使われる。
例
[注意] 処理系にあるコンパイラで確認していないため、間違っているかもしれません。
#include <array>
#include <cmath>
#include <execution>
#include <iostream>
#include <linalg>
#include <mdspan>
int main()
{
constexpr size_t M = 4;
constexpr size_t N = 4;
std::array<double, M * N> mat;
std::mdspan A(mat.data(), M, N);
for(int i = 0; i < A.extent(0); ++i) {
for(int j = 0; j < A.extent(1); ++j) {
A[i,j] = ((i + j) % 2 == 0 ? 1.0 : -1.0) / (i * A.extent(1) + j + 1);
}
}
std::cout << std::linalg::matrix_frob_norm(A, 1.0 / (M * N + 1)) << '\n'
<< std::linalg::matrix_frob_norm(std::execution::par, A, 1.0 / (M * N + 1)) << '\n'
<< std::linalg::matrix_frob_norm(A) << '\n'
<< std::linalg::matrix_frob_norm(std::execution::par, A) << '\n';
return 0;
}
出力
1.58781
1.58781
1.58435
1.58435
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??