C++에서 두 벡터의 내적 계산

Jinku Hu 2023년10월12일
  1. std::inner_product를 사용하여 C++에서 두 벡터의 내적 계산
  2. std::transform_reduce를 사용하여 C++에서 두 벡터의 내적 계산
  3. std::transform_reducestd::execution::par 사용 두 벡터의 내적 계산
C++에서 두 벡터의 내적 계산

이 기사에서는 C++에서 두 벡터의 내적을 계산하는 여러 방법을 보여줍니다.

내적은 두 벡터의 해당 요소의 곱의 합입니다. 두 개의 벡터-{1, 2, 3}{4, 5, 6}이 있고이 벡터의 내적은1*4 + 2*5 + 3*6 = 32라고 가정합니다.

std::inner_product를 사용하여 C++에서 두 벡터의 내적 계산

std::inner_product<numeric>헤더에 포함 된 C++ 숫자 알고리즘 라이브러리의 일부입니다. 이 메서드는 두 범위에서 제품의 합계를 계산합니다. 첫 번째는 begin/end반복자로 지정되고 두 번째 범위는 begin으로 만 지정됩니다. 이 함수는 누산기 값을 초기화하기 위해 네 번째 매개 변수로init를 사용합니다. 반환 값은 주어진 범위의 최종 내적 값입니다. std::inner_product는 항상 주어진 순서대로 작업을 수행합니다.

#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<int> vec1{1, 2, 3, 4, 5};
  vector<int> vec2{2, 4, 6, 8, 10};

  copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  cout << "Scalar product is: "
       << inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110

std::transform_reduce를 사용하여 C++에서 두 벡터의 내적 계산

이전 방법과 달리std::transform_reduce는 순서가 맞지 않는 범위에서 작업을 수행 할 수 있으므로 성능을 극대화 할 수 있습니다. std::transform_reduce는 본질적으로std::inner_product 알고리즘의 병렬화 된 버전입니다. 다음 예제는 이전 예제에서 전달 된 것과 동일한 인수를 사용하여 함수의 실행을 보여줍니다.

#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::inner_product;
using std::vector;

int main() {
  vector<int> vec1{1, 2, 3, 4, 5};
  vector<int> vec2{2, 4, 6, 8, 10};

  copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  cout << "Scalar product is: "
       << std::transform_reduce(vec1.begin(), vec1.end(), vec2.begin(), 0);

  return EXIT_SUCCESS;
}

출력:

1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110

std::transform_reducestd::execution::par 사용 두 벡터의 내적 계산

또는std::transform_reduce 알고리즘에 대한 실행 정책을 추가로 지정할 수 있습니다. 이 방법은이 매뉴얼에 정의 된 실행 규칙으로 프로그램 흐름을 사용자 지정할 수 있으므로 프로그래머에게 더 많은 제어를 제공합니다. transform_reduce를 사용하면 성능이 향상되지만 병렬 실행 정책을 지정할 때 항상 잠재적 경쟁 조건을 염두에 두어야합니다.

#include <execution>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::inner_product;
using std::vector;

int main() {
  vector<int> vec1{1, 2, 3, 4, 5};
  vector<int> vec2{2, 4, 6, 8, 10};

  copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  cout << "Scalar product is: "
       << std::transform_reduce(std::execution::par, vec1.begin(), vec1.end(),
                                vec2.begin(), 0);

  return EXIT_SUCCESS;
}

출력:

1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Vector