Skip to content

Latest commit

 

History

History
128 lines (95 loc) · 3.98 KB

matrix_frob_norm.md

File metadata and controls

128 lines (95 loc) · 3.98 KB

matrix_frob_norm

  • [mathjax enable]
  • linalg[meta header]
  • function template[meta id-type]
  • std::linalg[meta namespace]
  • cpp26[meta cpp]
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)
}
  • in-matrix[link inout-matrix.md]

概要

行列のフロベニウスノルムを計算する。

  • (1): 逐次実行する。
  • (2): 指定された実行ポリシーに応じて実行する。
  • (3): (1)でinitInMat::value_typeのデフォルト値を与えて逐次実行する。
  • (4): (2)でinitInMat::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>::valuetrue

効果

  • (3), (4): Tdecltype(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{})を返す。

戻り値

  • (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): Tdecltype(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{})を返す。

備考

  • (1), (2): もしInMat::value_typeScalarがどちらも浮動小数点数型またはstd::complexの特殊化で、ScalarInMat::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;
}
  • std::linalg::matrix_frob_norm[color ff0000]

出力

1.58781
1.58781
1.58435
1.58435

バージョン

言語

  • C++26

処理系

関連項目

参照