最終更新日時(UTC):
が更新

履歴 編集

function template
<linalg>

std::linalg::vector_idx_abs_sum(C++26)

namespace std::linalg {
  template<in-vector InVec>
  typename InVec::size_type
    vector_idx_abs_max(InVec v); // (1)

  template<class ExecutionPolicy, in-vector InVec>
  typename InVec::size_type
    vector_idx_abs_max(ExecutionPolicy&& exec,
                       InVec v); // (2)
}

概要

ベクトルの各成分の絶対値が最大となるインデックスを計算する。

  • (1): 逐次実行する。
  • (2): 指定された実行ポリシーに応じて実行する。

適格要件

戻り値

  • (1), (2): Nvの次元v.extent(0)とすると、以下を返す。

    • もしNが0ならstd::numeric_limits<typename InVec::size_type>::max()
    • そうでない場合、もしInVec::value_typeが算術型なら絶対値が最大の最初のvの成分のインデックス。つまり、

    $$ \mathop{\mathrm{argmax}}\limits_{i = 0, \dots, N - 1} |\verb|v[|i\verb|]|| $$

    • そうでない場合、

    $$ \mathop{\mathrm{argmax}}\limits_{i = 0, \dots, N - 1}\left\{|\mathrm{Re}(\verb|v[|i\verb|]|)| + |\mathrm{Im}(\verb|v[|i\verb|]|)|\right\} $$

[注意] 処理系にあるコンパイラで確認していないため、間違っているかもしれません。

#include <array>
#include <cmath>
#include <execution>
#include <iostream>
#include <linalg>
#include <mdspan>

int main()
{
  constexpr size_t N = 4;

  std::array<double, N> vec;

  std::mdspan v(vec.data(), N);

  for(int i = 0; i < v.extent(0); ++i) {
    v[i] = std::pow(-1.0, i) / (i + 1);
  }

  std::cout << std::linalg::vector_idx_abs_max(v) << '\n'                       // (1)
            << std::linalg::vector_idx_abs_max(std::execution::par, v) << '\n'; // (2)

  return 0;
}

出力

0
0

バージョン

言語

  • C++26

処理系

関連項目

参照