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

履歴 編集

function template
<linalg>

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

namespace std::linalg {
  template<in-object InObj,
          out-object OutObj>
  void copy(InObj x,
           OutObj y);                 // (1)

  template<class ExecutionPolicy,
           in-object InObj,
           out-object OutObj>
  void copy(ExecutionPolicy&& exec,
            InObj x,
            OutObj y);                // (2)
}

概要

同じサイズの行列またはベクトルのxyに対して、xyにコピーする。

テンプレートパラメータ制約

xyの次元が等しくなければならない。

  • x.rank() == y.rank()

適格要件

事前条件

xyの各次元の要素数が等しくなければならない。

  • x.extents() == y.extents()

効果

xの各成分をyにコピーする。

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

戻り値

なし

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

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


template <class Vector>
bool IsEqual(Vector a, Vector b) {
  if (a.extent(0) != b.extent(0)) {
    return false;
  }
  for (int i = 0; i < a.extent(0); ++i) {
    if (a[i] != b[i]) {
      return false;
    }
  }
  return true;
}


int main()
{
  constexpr size_t N = 3;

  std::vector<double> a_vec({1, 2, 3});
  std::mdspan a(a_vec.data(), N);

  std::vector<double> b_vec(N);
  std::mdspan b(b_vec.data(), N);

  // (1)
  std::linalg::copy(a, b);
  assert(IsEqual(a, b));

  // (2)
  std::linalg::copy(std::execution::par, a, b);
  assert(IsEqual(a, b));

  return 0;
}

出力

バージョン

言語

  • C++26

処理系

関連項目

参照